当类类型存储在变量中时,如何创建类的实例?

时间:2015-09-24 05:01:05

标签: python class oop

所以我在脚本中有一个有点长且不断增长的类列表。在脚本中的某个点,我希望能够为其类型测试任意实例,然后无论该类型是什么,我想创建一个相同类型的第二个对象。我已经尝试过研究这个,我知道我可以通过将每个类存储在字典中来实现这一点,如下所示:

class Foo(object):
    pass
class Bar(object):
    pass
d = {"Foo": Foo, "Bar": Bar}
x = dict["Foo"]()

它的功能,允许我使用包含类名称的变量或字符串,以创建类的实例。但是,它要求每次我创建一个新类时我都要记住在字典中添加一个新条目 - 这不是世界上最糟糕的事情,但正如他们所说,如果你做同样的事情任务不止一次你应该让电脑去做。

有更好的方法吗?你能以某种方式获取包含类名的变量或字符串,并且不知道变量或字符串有什么值,生成类的实例吗?

3 个答案:

答案 0 :(得分:2)

所有类都在globals字典中(字典包含当前范围的全局变量)。获取globals()的字典,然后按名称(字符串)查找。因此,您将获得一个类,可以使用()实例化。

class Foo(object):
    pass

x = globals()['Foo']()

答案 1 :(得分:2)

所以这是回答你的问题而不是你的问题,但似乎你真的想要创建一个对象的另一个实例,而不是按名称查找一个类。这样更容易,因为您可以找到具有type函数的对象的类。因此,要创建与b相同类型的新实例a,但使用构造函数参数args,只需执行以下操作:

b = type(a)(args)

答案 2 :(得分:0)

不确定高华佐为何没有得到答案,但它确切地解决了我的问题,而且我在研究这个问题时从未见过这个解决方案 - 所以我会继续把它打成一个答案。

您可以使用类名称和eval()函数的字符串来完成此操作。所以

class Foo(object):
    pass
a = Foo()
s = str(type(a))
# The string produced isn't quite the name of the class so it has to be stripped 
# of some surrounding characters.
m = s.find('.')
n1 = s.find("'")
n2 = s[n1+1:].find("'")
s = s[m+1:n1+n2+1]
b = eval(s + "()")

产生所需的行为。