2012-01-26 15 views
1

通常の方法:モジュールから動的クラスの関数を呼び出すにはどうすればよいですか?

私はそれをしたいどのように
import ham 
ham.eggs.my_func() 
ham.sausage.my_func() 

"動的" 方法:

str = 'eggs' 
ham.str.my_func() 
str = 'sausage' 
ham.str.my_funct() 

同じことが、理想的に私はループ内でそれを使用する方法:基本的に

for x in ['eggs', 'sausage'] 
    ham.x.my_func() 

、どのクラスのmy_funcを呼び出すかを文字列で指定しますか?

+0

'ham.str.my_func()'は実際には動作しません。あなたは知っています... –

+0

いいえ、私はそれをしたいと思います。だから私はその質問をしている。それが私の意図です。 –

+0

あなたがその質問をどのように書いているのかは分かりませんでした。 –

答えて

5
getattr(ham, x).my_func() 

これは、その名前だったxの内容(x'foo'であれば、それはham.fooだろう)、そして呼び出す属性として割り当てられたhamから(Pythonが入力されたカモです)メソッド/事を取得しますmy_func on this

hamには正しい名前のメソッドがないと例外が発生します。

ちなみに、ham.str.my_func()の例はgetattr(ham, str).my_func()である必要があります。

本当ににする場合は、impメソッドを使用して特定のタイプのメンバーのみを取得するか、追加のイントロスペクションを使用できます。

+0

また、my_func()も文字列として作成したい場合はどうすればよいですか?つまり、... my_func = 'パン' ham.str.my_func() –

+0

「str」という名前の変数に注意してください。あなたはビルトインクラスを隠しています。 – Johnsyweb

+0

@johnsmith:あなたは同じことをやり直しますが、今回はgetattr(getattr(ham、x)、my_func)()は 'ham。と同じです。 __call __() 'です。 – Borealid

関連する問題