在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())

+0

想问你一个问题,然后......在Python中没有一种方法来评估字符串类名。也许通过评估?换句话说,我认为这个字符串可以与类名匹配,然后自动转换为引用。谢谢 – Kris

+0

@Kris:'eval'只能作为最后的手段。 'globals()'字典给你一个从字符串值到对象的直接映射。如果你所拥有的只是变量'name'中的一个字符串名,那么'globals()[name]'会给你这个对象。 –

+0

谢谢。只是为了澄清 - 你的例子在上面工作,一切都很好。只是想知道如何做到这一点的替代方案(和不太理想的方法)。再次感谢。 – Kris