反射 ********** ide
gerattr(a,b) 根據字符串爲參數 (第二個參數) , 去 對象(第一個參數) 中尋找與之同名的成員.函數
例一 : 面對函數的反射spa
如今有2個py文件(在同一個文件下面的平等文件),如今想從run.py 中調用 handler.py 中的東西.3d
#handler.py f0 = 9 def f1(): print('F1') def f2(): print('F2') def f3(): print('F3') def f4(): print('F4') def f5(): print('F5')
#run.py #咱們能夠使用if ...elif....的方法執行 import handler while True: print(""" 系統支持的函數有: 1 f0 2 f1 3 f2 4 f3 5 f4 6 f5 """) num = input("請輸入您要執行的函數:") if num == "f0": print(9) elif num == 'f1': handler.f1() elif num == 'f2': handler.f2() elif num == 'f3': handler.f3() elif num == 'f4': handler.f4() elif num == 'f5': handler.f5() #用 if...elif...方法,若是在handler.py文件的函數特別多,就會使代碼繁雜.
while True: print(""" 系統支持的函數有: 1. f1 2. f2 3. f3 4. f4 5. f5 """) val = input("請輸入要執行的函數:") # val = "f1" if hasattr(handler,val): func_or_val = getattr(handler,val) # 根據字符串爲參數,去模塊中尋找與之同名的成員。 if isinstance(func_or_val,FunctionType): #判斷是不是函數 func_or_val() else: print(func_or_val) else: print('handler中不存在輸入的屬性名')
全部,咱們 比較 方法一 和方法二,發現方法二比方法一簡介並且定位準code
例二 : 面對 面向對象的反射對象
class Foo(object): country = "中國" def func(self): pass v = getattr(Foo,'func') # Foo.func # 根據字符串爲參數,去類中尋找與之同名的成員。 print(v) obj = Foo() v = getattr(obj,"func") # obj.func # 根據字符串爲參數,去對象中尋找與之同名的成員。 print(v) 結果: <function Foo.func at 0x00000000025FCEA0> <bound method Foo.func of <__main__.Foo object at 0x00000000025FB2E8>>
#反射----類 class Foo(object): def __init__(self,a1): self.a1 = a1 self.a2 = None obj = Foo(1) v1 = getattr(obj,'a1') print(v1) setattr(obj,'a2',2)
x1 = 123 def f1(arg): print(arg,666)
import xx # getattr #查找 v1 = getattr(xx,'x1') v2 = getattr(xx,'f1') v2('楊森') # 楊森 666 # hasattr #判斷是否由成員 v3 = hasattr(xx,'x1') v4 = hasattr(xx,'f1') v4 = hasattr(xx,'f1') v5 = hasattr(xx,'xxxxxxx') print(v3,v4,v5) #True True False # setattr #在內存中添加 x2= 999 setattr(xx,'x2',999) v6 = getattr(xx,'x2') print(v6) # 999 setattr(xx,'f2',lambda x:x+1) #添加一個函數 v7 = getattr(xx,'f2') v8 = v7(1) print(v8) # 2 由於 添加函數 x+1 參數爲1 # delattr #刪除 x1 delattr(xx,'x1') v9 = getattr(xx,'x1') print(v9) 結果:
總結:blog
getattr(a,b) : 根據字符串爲參數(第二個參數b),去對象中(第一個參數a)尋找與之同名的成員內存
hasattr(a,b) : 根據字符串形式(第二個參數b) ,去判斷對象(第一個參數a)中是否有該成員v8
setattr (a,b,c): 參數分別是新建對象所屬類的類名,新建對象的對象名,對象的值 (在內存中體現,在文件中是看不到的)字符串
delattr(a,b) : 根據字符串爲參數 (b),動態的刪除對象中(第一個a)一個成員(在內存中體現)