Python3學習之路~7.3 反射
阿新 • • 發佈:2019-03-01
err onclick 內存地址 urn 技術 pytho light src eight
python中的反射功能是由以下四個內置函數提供:hasattr、getattr、setattr、delattr,該四個函數分別用於對對象內部執行:檢查是否含有某成員、獲取成員、設置成員、刪除成員。
hasattr(obj,name_str):判斷一個對象obj裏是否有name_str字符串對應的的方法或者屬性
getattr(obj,name_str):相當於obj.name_str,根據字符串去獲取obj對象裏對應的方法的內存地址或對應屬性的值
setattr(x, ‘y‘, v) :相當於``x.y = v‘‘,即通過字符串設置新的屬性或方法
delattr(x, ‘y‘):相當於``del x.y‘‘,刪除對象obj裏y字符串對應的屬性
class Foo(object): def __init__(self): self.name = ‘wupeiqi‘ def func(self): return ‘func‘ obj = Foo() # #### 檢查是否含有成員 #### hasattr(obj, ‘name‘) hasattr(obj, ‘func‘) # #### 獲取成員 #### getattr(obj, ‘name‘) getattr(obj, ‘func‘) # #### 設置成員 ####反射代碼示例1setattr(obj, ‘age‘, 18) setattr(obj, ‘show‘, lambda num: num + 1) # #### 刪除成員 #### delattr(obj, ‘name‘) delattr(obj, ‘func‘)
反射代碼示例2:
#Author:Zheng Na def bulk(self): #外部方法 print("%s is yelling..." % self.name) class Dog(object): def __init__(self,name,age): self.name = name self.age = age def eat(self): print("%s is eating..." %self.name) d = Dog("小黃",1) choice = input("請輸入屬性或方法>>:").strip() if choice == "name": # 判斷對象中是否有字符串對應的屬性 print(hasattr(d,choice)) # true # 根據字符串去對象中獲取對應屬性的值 attr = getattr(d,choice) print(attr) # 小黃 # 修改對象中字符串對應屬性的值 setattr(d,choice,"小白") print(d.name) # 小白 # 刪除對象中字符串對應的屬性 delattr(d,choice) print(d.name) # 報錯:AttributeError: ‘Dog‘ object has no attribute ‘name‘ elif choice == "eat": # 判斷對象中是否有字符串對應的方法 print(hasattr(d, choice)) # true # 據字符串去獲取obj對象裏對應的方法的內存地址,然後調用這個方法 func = getattr(d,choice) func() # 小黃 is eating... # 方法不能刪除?還是我的用法有錯? # delattr(d, choice) # 報錯:AttributeError: eat elif choice == "talk": # 通過字符串設置新的方法,可動態地將一個外部的方法裝配到類裏 # bulk現在相當於一個變量名,你現在用talk來代替了 # 1.方法寫死 # setattr(d,choice,bulk) # d.talk(d) # 小黃 is yelling... # 2.方法不寫死 setattr(d,choice,bulk) func = getattr(d,choice) func(d) # 小黃 is yelling... else:# choice輸入money # 通過字符串設置新的屬性 setattr(d, choice, 22) print(getattr(d,choice)) # 22
3種方式獲取obj對象中的name變量指向內存中的值 “alex”
class Foo(object): def __init__(self): self.name = ‘alex‘ def func(self): return ‘func‘ # 不允許使用 obj.name obj = Foo() print(obj.name) print(getattr(obj, ‘name‘)) print(obj.__dict__[‘name‘])
Python3學習之路~7.3 反射