1,使用系統函數import()
stringmodule = _import('string')
2,使用imp 模組
import imp
stringmodule = imp.loadmodule('string',*imp.findmodule('string'))
3,使用exec
importstring = "import string as stringmodule"
exec importstring
import importlib
importlib是import的python實現
1、擷取模組對象
m1 = importlib.importmodule("sites.sitespybuild")
print(m1)
輸出:
2、擷取類對象
aclass = getattr(m1, "sites_pybuild")
print(aclass)
輸出:
3、執行個體化對象
p = aclass("test")
相當於直接使用p = sites.sitespybuild.sitespybuild("test")
下面的文章也可以實現反射,主要思想是先匯入module,然後使用globals()["classname"]獲得類定義,再使用此類定義來初始化對象。
http://blog.csdn.net/lokibalder/article/details/3459722
python是一個指令碼語言,它不象java一樣有一個專門的包來處理反射。以 下是我們來看看python是怎麼做到類似java一樣的反射功能的。我在網上搜了一下,因為在網上沒有很明確的文章說要怎麼做,所以,我寫了這篇,希望 新手不要向我一樣走彎路,因為是新手,所以,我在這裡沒能考慮到異常的處理。
-、動態載入類
說到動態載入類,那就不得不說,動態加態模組。因為只能成功的加模了模組才能載入到類。我們可以用,以下的代碼來動態載入類
Python代碼
#modulePath是模組檔案的路徑+模組的檔案名稱。
aMod = sys.modules[modulePath]
當我們動態載入了這個模組後,我們就可以從這個模組中取得你要的類了,感覺上這個方法有點像java中從類中反射出方法。下以的代碼可以
Python代碼
aClass= getattr(aMod, className)
二、動態執行個體化類
得到了class對象之後,在python就可以很方便的得到他的對像,以下這代碼
Python代碼 obj = new.instance(aClass)
三、得到對象、類或模組中的所有屬性方法
在java的反射中我們可以得到對象中的所有屬性和方法,在python中,因為是指令碼語言,所以我們要得到這個些屬性方法更加的方便,我們可以用以下的代碼獲得類,對象,模組中的所有的屬性的名稱
Python代碼
dir(aClass)
我們得到這些屬性的名稱後,可以用上面得到class 的方法來獲得這個對象裡的所有屬性
四、動態運行方法
動態運行方法,我們也非常的方便,因為python是指令碼語言,感覺起來很象javascript的方式來調用方法。
Python代碼
apply(objFunc,arrArgs)
代碼中objFunc是用getAttr從執行個體化後的對象中取得到function,而arrArgs是我們的參數,和javascript一樣,他是數組一樣的對象。
有了這些方法,我們就可以做和java反射一樣做的事了,我在網上找到了一個模組,小改了一下,使得用這個模組可以很方便的用類名執行個體化一個執行個體和運行這個執行個體中的方法,如果大家需要可以down下來看看