什么是反射?
1、有時我們要訪問某個變量或是方法時並不知道到底有沒有這個變量或方法,所以就要做些判斷。判斷是否存在字符串對應的變量及方法。
2、我們知道訪問變量時是不能加引號的,否則會被當成字符串處理。如果要通過字符串找到對應的變量,那該怎么辦呢
反射就是用於解決上面兩個問題而產生的,所謂反射,按我的理解就是反過來告訴我字符串是什么,是變量or方法
python中訪問類或對象的成員有三種方法
##如下所示 obj 為對象 var為變量 func為函數
1、obj.var 或 obj.func()
2、obj.__dict__['var']
3、getattr(obj,'var')
反射有4個方法 getattr() hasattr() setattr() delattr()
舉例子如下,一目了然

class A(object): gvar = 'min' def __init__(self,name,male): self.name = name self.male = male def func1(self): print "func1 :my name is %s" % self.name def func2(self): print "func2 :I'm a %s" % self.male ##實例化對象 obj = A('min','girl') hasattr(obj,'gvar') hasattr(obj,'func1') getattr(obj,'gvar') getattr(obj,'name') getattr(obj,'func1') getattr(obj,'func2')() setattr(obj,'gvar','ben') getattr(obj,'gvar') delattr(obj,'gvar') ##python中一切事物都是對象,故其實上面的obj也是可以是類名,模塊名 getattr(A,'func2') hasattr(A,'func1')
#當某個字符串就是模塊名時,我們導入模塊時可以用以下方法導入
mymodule = __import__(var) #這個就相當於導入模塊var.py了
導入后,你可以在你的代碼中用mymodule.*來調用該模塊下的任意方法
1 >>> class A(object): 2 ... gvar = 'min' 3 ... def __init__(self,name,male): 4 ... self.name = name 5 ... self.male = male 6 ... def func1(self): 7 ... print "func1 :my name is %s" % self.name 8 ... def func2(self): 9 ... print "func2 :I'm a %s" % self.male 10 ... 11 >>> ##實例化對象 12 ... obj = A('min','girl') 13 >>> hasattr(obj,'gvar') 14 True 15 >>> hasattr(obj,'func1') 16 True 17 >>> getattr(obj,'gvar') 18 'min' 19 >>> getattr(obj,'name') 20 'min' 21 >>> getattr(obj,'func1') 22 <bound method A.func1 of <__main__.A object at 0x7f7b89f99a50>> 23 >>> getattr(obj,'func2')() 24 func2 :I'm a girl 25 >>> setattr(obj,'gvar','ben') 26 >>> getattr(obj,'gvar') 27 'ben' 28 >>> delattr(obj,'gvar') 29 >>> ##python中一切事物都是對象,故其實上面的obj也是可以是類名,模塊名 30 ... getattr(A,'func2') 31 <unbound method A.func2> 32 >>> hasattr(A,'func1') 33 True