所以我有一组类和一个带有类名的字符串。如何基于该字符串实例化一个类?
class foo:
def __init__(self, left, right):
self.left = left
self.right = right
str = "foo"
x = Init(str, A, B)
我希望x成为类foo的实例化。
答案 0 :(得分:17)
在您的情况下,您可以使用类似
的内容get_class = lambda x: globals()[x]
c = get_class("foo")
从模块
获取课程更容易import somemodule
getattr(somemodule, "SomeClass")
答案 1 :(得分:15)
如果您知道所涉及的命名空间,则可以直接使用它 - 例如,如果所有类都在模块zap
中,则字典vars(zap)
是该命名空间;如果它们都在当前模块中,globals()
可能是获取该词典的最便捷方式。
如果这些类不在同一个命名空间中,那么构建一个“人工”命名空间(一个专用的dict,类名作为键,类对象作为值),正如@Ignacio所暗示的那样,可能是最简单的方法。
答案 2 :(得分:6)
classdict = {'foo': foo}
x = classdict['foo'](A, B)
答案 3 :(得分:4)
classname = "Foo"
foo = vars()[classname](Bar, 0, 4)
或者
def mkinst(cls, *args, **kwargs):
try:
return globals()[cls](*args, **kwargs)
except:
raise NameError("Class %s is not defined" % cls)
x = mkinst("Foo", bar, 0, 4, disc="bust")
y = mkinst("Bar", foo, batman="robin")
该片段的其他说明:
*args
和**kwargs
是Python中的特殊参数,它们的意思是“一系列非关键字args”和“关键字args的字典”。
PEP-8(官方Python风格指南)建议对类变量使用cls
。
vars()
返回在本地范围内定义的变量的字典。
globals()
返回当前存在于本地范围之外的环境中的变量的字典。
答案 4 :(得分:1)
答案 5 :(得分:1)
您也可以考虑使用元类:
Cls = type('foo', (), foo.__dict__)
x = Cls(A, B)
然而它创造了另一个类似的类。