2012-04-23 29 views
16

pythonでは、__call__メソッドを実装することでインスタンスを呼び出し可能にすることができます。いつ__call__を実装する必要があります

class Blah: 
    def run(self): 
     print "hello" 

obj = Blah() 
obj.run() 

をすると、私は__call__を実装する必要があります。たとえば

class Blah: 
    def __call__(self): 
     print "hello" 

obj = Blah() 
obj() 

は、しかし、私はまた私自身の方法を実装することができ、「実行」を言うの?

+9

意味があるとき。 –

+12

'__call__'が必要かどうかわからない場合は、' __call__'は必要ありません。 –

答えて

19

これは答えにくいです。私の意見では、実際の目的が機能を作成することでない限り、__call__を決して定義するべきではないということです。これは、あなたがすでに伝統的なオブジェクトを作成した後に行うことではありません。

つまり、「オブジェクトを作成しようとしている」と思っている場合は、最終的には__call__を実装するべきではありません。一方、「私は関数を作成するつもりですが、オブジェクトフレームワークを使用して関数に何らかの状態を持たせたい場合は、状態として定義し、関数のように動作させるために__call__を定義します。

私は彼が書いた質問へのコメントに@Paul Mantaによって提供されたアドバイスの最後に1ビットを含める:

あなたが__call__が必要な場合がわからない場合、あなたはしないでください必要があります__call__

私はそれが良いアドバイスだと思います。

+0

+1 - クロージャは、言い切れない混乱になり、呼び出し可能なオブジェクトがより良いアプローチになることがあります。しかし、それはそれについてです。 – detly

関連する問題