我有类名列表,并希望动态创建它们的实例。例如:
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中动态创建该实例?谢谢!
这通常被称为反思或有时被内省。查看一个类似的问题,这些问题可以解答您要执行的操作:
假设您已经使用类似的东西导入了相关的类
from [app].models import *
你需要做的就是
klass = globals()["class_name"]
instance = klass()
您可以使用python builtin eval()
语句来实例化您的类。像这样:
aa = eval(cName)()
您通常可以完全避免字符串处理部分。
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中,您可以只使用类本身。
这对我有用:
from importlib import import_module
class_str: str = 'A.B.YourClass'
try:
module_path, class_name = class_str.rsplit('.', 1)
module = import_module(module_path)
return getattr(module, class_name)
except (ImportError, AttributeError) as e:
raise ImportError(class_str)