2017-10-21 91 views
-5

我試圖通過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 

回答

0

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