2010-08-10 114 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() 
相关问题