2017-10-21 9 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()は、名前のソートされたリストを生成する。これらは単なる文字列です。実際のオブジェクトへの参照ではありません。文字列への呼び出しを適用することはできません。基本的に、引数なしで、モジュールレベルで

for name, obj in globals().items(): 
    if not name.startswith('__'): 
     print "name =", name 
     instance = obj() 
     instance.replay() 

dir()sorted(globals())を返します。

は使用globals() dictionaryではなく、これは名前と実際のオブジェクトの両方であなたのマッピングを提供します。

+0

もう1つ質問してみたいです。文字列をクラス名に評価するPythonの方法はありません。たぶんeval経由ですか??つまり、この文字列をクラス名と照合して、自動的に参照に変換できると思います。ありがとう – Kris

+0

@Kris: 'eval'は最後の手段としてのみ使用するべきです。 'globals()'ディクショナリは文字列値からオブジェクトへの直接マッピングを提供します。あなたが持っているものが 'name'変数に文字列名であれば、' globals()[name] 'はあなたにオブジェクトを与えます。 –

+0

ありがとうございます。上で働いたあなたの例は、すべてが良いです。これを行う方法の選択肢(とそれほど最適ではない)について疑問に思っていただけです。再度、感謝します。 – Kris

関連する問題