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

Nya*_*baa 39 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)
Run Code Online (Sandbox Code Playgroud)

如何在Python中动态创建该实例?谢谢!

ele*_*nso 46

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

from [app].models import *
Run Code Online (Sandbox Code Playgroud)

你需要做的就是

klass = globals()["class_name"]
instance = klass()
Run Code Online (Sandbox Code Playgroud)

  • @Nyxynyx 查看“保留字”的编程概念;您通常希望避免使用您正在使用的语言和库中常用作对象和函数名称的单词 (6认同)
  • 为什么你把它命名为“class”?这个词有什么特殊的含义吗? (4认同)
  • 美丽的答案。 (2认同)

Sco*_*nce 22

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

Python是否具有与Java类forname相同的功能

您可以使用字符串在Python中实例化一个类

  • 请勿使用链接,请提供真实的说明. (4认同)

Tob*_*nst 9

这对我有用:

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)
Run Code Online (Sandbox Code Playgroud)

  • 对我来说效果很好!谢谢你!! (2认同)
  • 是的,使用 importlib 来解析类比使用星型导入等反模式手动处理它要好得多。从 python 3.3 开始,这个答案是最好的解决方案。 (2认同)

hb2*_*cil 6

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

aa = eval(cName)()
Run Code Online (Sandbox Code Playgroud)

  • 不要使用eval,因为它易受安全问题的影响. (6认同)
  • 它是如何易受影响的? (2认同)
  • 根据上下文,如果“cName”来自用户的某些输入,那么这是危险的,因为黑客可以在那里注入 Python 代码:确实如此,但很多时候您只需要它从文本文件或环境变量设置应用程序仅由开发人员/管理员控制,在这种情况下足够安全且简单。 (2认同)

S.L*_*ott 5

您通常可以完全避免使用字符串处理。

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)
Run Code Online (Sandbox Code Playgroud)

请注意,我们不使用类名称的字符串表示形式。

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