2010-08-10 146 views
26

我有類名的列表,並想動態創建它們的實例。例如:如何在python中動態創建一個類的實例?

names=[ 
'foo.baa.a', 
'foo.daa.c', 
'foo.AA', 
.... 
] 

def save(cName, argument): 
aa = create_instance(cName) # how to do it? 
aa.save(argument) 

save(random_from(names), arg) 

如何在Python中動態創建該實例?謝謝!

回答

18

這通常被稱爲反思或有時反思。檢查出有一個答案了類似的問題,爲你正在嘗試做的事:

Does Python Have An Equivalent to Java Class forname

Can You Use a String to Instantiate a Class in Python

+1

其中一些示例使用'__import__',對於更新的代碼,您可以切換到'importlib' http://docs.python.org/dev/library/importlib.html。 (py> = 2.7 |> = 3.1) – SiggyF 2010-08-10 17:56:42

+1

請勿使用鏈接,請提供真實的說明。 – shadowbq 2017-04-25 12:30:35

3

您可以使用Python內置eval()語句來實例化類。 這樣的:

aa = eval(cName)() 
+4

,因爲它容易受到安全問題,不要使用eval。 – Necrolyte2 2013-03-22 18:18:30

+1

,它是如何易感? – 2017-12-06 11:34:04

4

你可以經常避免這種字符串處理部分完全。

import foo.baa 
import foo.AA 
import foo 

classes = [ foo.baa.a, foo.daa.c, foo.AA ] 

def save(theClass, argument): 
    aa = theClass() 
    aa.save(argument) 

save(random.choice(classes), arg) 

請注意,我們不使用類的名稱的字符串表示形式。

在Python中,您可以使用類本身。

+0

假設該數組來自數據庫。所以這個解決方案沒有幫助。 – 2018-02-05 14:39:19

27

假設您已經導入使用的東西相關的類,如

from [app].models import * 

所有你需要做的是

klass = globals()["class_name"] 
instance = klass() 
相關問題