2009-12-06 27 views
21

私はPythonクラスを持っていて、変数に応じて関数を呼び出す場合、どうすればよいでしょうか?私は次のことができると想像しました:文字列のメソッドを呼び出す

class CallMe: # Class 

    def App(): # Method one 

     ... 

    def Foo(): # Method two 

     ... 

variable = "App" # Method to call 

CallMe.variable() # Calling App() 

しかし、それはできませんでした。これを行う他の方法?あなたがこれを行うことができます

+1

どのような値を 'variable'に配置するかはどのように決めるのですか? –

+0

ファイルに渡された引数を使用します。 :) – Sirupsen

答えて

57

getattr(CallMe, variable)() 

getattrは、それが指定されたオブジェクトの帰属の値を返す、組み込みの方法です。この場合の値は、()で呼び出すことができるメソッドオブジェクトです

+1

値が '' CallMe "'の文字列があれば、どうすればいいですか? – Y2H

3

あなたのコードはPythonのようには見えませんが、あなたはこのようにしたいでしょうか?

1

getattrを使用するか、バインドされたメソッドまたはバインドされていないメソッドを変数に割り当てることができます。バインドされたメソッドはクラスの特定のインスタンスに関連付けられ、バインドされていないメソッドはクラスに関連付けられているため、最初のパラメータとしてインスタンスを渡す必要があります。

class CallMe: 
    def App(self): 
     print "this is App" 

    def Foo(self): 
     print "I'm Foo" 

obj = CallMe() 

# bound method: 
var = obj.App 
var()   # prints "this is App" 

# unbound method: 
var = CallMe.Foo 
var(obj)  # prints "I'm Foo" 
1

あなたのクラスは「旧式のクラス」として宣言されています。すべてのクラスを「新しいスタイルのクラス」にすることをお勧めします。

古いものと新しいものとの違いは、新しいスタイルのクラスで継承を使用できることです。これはすぐには必要ない可能性があります。しかし、入るのは良い習慣です。

新しいスタイルのクラスを作るために必要なのは、Pythonの構文を使って "オブジェクト"から継承するということです。クラス名の後に括弧を入れて、というオブジェクトをの括弧の中に入れます。同様に:

class CallMe(object): # Class 

    def App(): # Method one 

     ... 

    def Foo(): # Method two 

     ... 

私が言ったように、すぐに継承を使う必要はないかもしれませんが、これは良い習慣です。 StackOverflowには、「私はXを実行しようとしていますが、動作しません」というようないくつかの質問があり、古いスタイルのクラスをコード化している人がいることがわかります。

関連する問題