說起反射,大家應該都不陌生吧,特別是熟悉Java的程序員,一定經常和Class.forName打交道。Java的眾多框架中,如Spring,eclipse plugin機制等很多都依賴於Java的反射技術。感覺反射在Java中屬於比較高級的技術,通常作為高級主題來講述。
但是在Python中反射比java中簡單得多。使用反射獲取到的函數和方法可以像平常一樣加上括號直接調用,獲取到類后可以直接構造實例。
學習發現Python之后發現Python有個eval函數。eval 函數的功能是將字符串生成語句執行。
如下所示:
#encoding=utf-8 ''' Created on 2013-08-29 @author: Martine ''' class Test(object): def __init__(self): self.name = 'tesname' def foo(self,name): self.name = name if __name__ == "__main__": # print 'this is my first python ...' eval_test = eval('Test()') print eval_test print 'old name is :%s ' % eval_test.name func = getattr(eval_test, 'foo') print func func('new_name') print 'new name is :%s ' % eval_test.name
輸出如下:
<__main__.Test object at 0x000000000287CEF0> old name is :tesname <bound method Test.foo of <__main__.Test object at 0x000000000287CEF0>> new name is :new_name
1.可以看到,使用eval('Test()')創建了一個Test對象,可以看到該對象的內存地址。
2.有了對象之后,就可以使用該對象的屬性,如eval_test.name,可打印出來
3.可通過getattr(eval_test, 'foo')函數獲取對象的foo函數的引用
4.然后可以直接像平常調用函數一樣直接使用func('new_name'),修改對象的name值,打印新的name值發現是new_name,發現函數調用確實成功了。
總結:簡單利用eval函數可以實現反射,這個對於需要在程序運行時才生成對象以及調用對象的項目中是很有用的。