在for循环中创建一个实例
问题描述:
我试图通过dir()提取类名并通过for循环中的变量名实时创建它们的实例。我如何使python将'item'解释为变量名称而不是'不存在'的类名称。在for循环中创建一个实例
>>> class cls1():
... def __init__(self):
... self.speak = 'say cls1'
... def replay(self):
... print self.speak
...
>>> for item in dir():
... if item[:2] != '__':
... print 'item = ', item
... x = item()
... x.reply()
...
item = cls1
Traceback (most recent call last):
File "<stdin>", line 4, in <module>
TypeError: 'str' object is not callable
答
dir()
产生一个排序的名称列表;这些只是字符串。它们不是对实际对象的引用。您无法将调用应用于字符串。
使用globals()
dictionary相反,这给你一个映射同时与名和实际对象:
for name, obj in globals().items():
if not name.startswith('__'):
print "name =", name
instance = obj()
instance.replay()
dir()
在模块级,不争论,实质上返回sorted(globals())
。
想问你一个问题,然后......在Python中没有一种方法来评估字符串类名。也许通过评估?换句话说,我认为这个字符串可以与类名匹配,然后自动转换为引用。谢谢 – Kris
@Kris:'eval'只能作为最后的手段。 'globals()'字典给你一个从字符串值到对象的直接映射。如果你所拥有的只是变量'name'中的一个字符串名,那么'globals()[name]'会给你这个对象。 –
谢谢。只是为了澄清 - 你的例子在上面工作,一切都很好。只是想知道如何做到这一点的替代方案(和不太理想的方法)。再次感谢。 – Kris