从名称实例化Python类

时间:2010-02-09 02:21:04

标签: python

所以我有一组类和一个带有类名的字符串。如何基于该字符串实例化一个类?

class foo:
  def __init__(self, left, right):
     self.left = left
     self.right = right

str = "foo"
x = Init(str, A, B)

我希望x成为类foo的实例化。

6 个答案:

答案 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)

试试这个

cls = __import__('cls_name')

这个 - http://effbot.org/zone/import-confusion.htm可能有帮助

答案 5 :(得分:1)

您也可以考虑使用元类:

Cls = type('foo', (), foo.__dict__)
x = Cls(A, B)

然而它创造了另一个类似的类。