How do you create an instance of a class when the class type is stored in a variable?
所以我在一个脚本中有一个有点长的类列表。在脚本的某一点上,我希望能够测试其类型的任意实例,然后无论该类型是什么,我都希望创建同一类型的第二个对象。我尝试过研究这个问题,我知道我可以通过将每个类存储在字典中来完成这个任务,比如:
1 2 3 4 5 6 | class Foo(object): pass class Bar(object): pass d = {"Foo": Foo,"Bar": Bar} x = dict["Foo"]() |
它实现了这个技巧,允许我使用包含类名称的变量或字符串来创建类的实例。然而,它要求每次我创建一个新的类时,我必须记住在字典中也要放一个新条目——这不是世界上最糟糕的事情,但正如他们所说,如果你不止一次做同一个任务,你应该让一台计算机来做。
有更好的方法吗?您是否可以以某种方式获取包含类名称的变量或字符串,并且不知道该变量或字符串具有什么值,就生成该类的实例?
所以这是在回答你的问题,而不是你的问题,但你似乎真的想要创建一个对象的另一个实例,而不是按名称查找一个类。这样做更容易,因为您可以使用
1 | b = type(a)(args) |
所有类都在全局字典(包含当前作用域全局变量的字典)中。用
1 2 3 4 | class Foo(object): pass x = globals()['Foo']() |
不知道为什么华左高没有回答这个问题,但它确实解决了我的问题,而且我在研究这个问题时从来没有看到过这个解决方案,所以我会继续把它作为一个答案。
您可以使用类名称的字符串和
1 2 3 4 5 6 7 8 9 10 11 | 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 +"()") |
产生所需的行为。