如何在python中动态创建类的实例?

问题描述 投票:35回答:5

我有类名列表,并希望动态创建它们的实例。例如:

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中动态创建该实例?谢谢!

python
5个回答
21
投票

这通常被称为反思或有时被内省。查看一个类似的问题,这些问题可以解答您要执行的操作:

Does Python Have An Equivalent to Java Class forname

Can You Use a String to Instantiate a Class in Python


39
投票

假设您已经使用类似的东西导入了相关的类

from [app].models import *

你需要做的就是

klass = globals()["class_name"]
instance = klass()

6
投票

您可以使用python builtin eval()语句来实例化您的类。像这样:

aa = eval(cName)()

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中,您可以只使用类本身。


1
投票

这对我有用:

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)
© www.soinside.com 2019 - 2024. All rights reserved.