次のコードを取得しました。
class Callable:
def __init__(self, func):
self.__call__ = func
テストすると、次の結果が得られます。
>>> square = Callable(lambda x: x**2)
>>> square(3)
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
TypeError: 'Callable' object is not callable
>>> square.__call__(3)
9
>>>
さらに、__call__
クラス定義でメソッドを定義すると、オブジェクトは呼び出し可能ですが、オブジェクトは関数に渡したものですが、クラス__call__
が呼び出されます。__call__
__init__
class Callable:
def __call__(self, x):
return -x
def __init__(self, func):
self.__call__ = func
さて、テストすると次のようになります。
>>> square = Callable(lambda x: x**2)
>>> square(3)
-3
>>> square.__call__(3)
9
>>>
Python 2 では、これは期待どおりに機能します (x(args)
呼び出しx.__call__(args)
)。これが Python 3.4 で機能しないのはなぜですか? そして、どうすればこれを修正できますか?
回答:なぜこれがこのように振る舞うかを確認した後、私は自分の質問に答えています ここ.
クライアントに影響を与えずにこれを修正する簡単な方法は次のとおりです。
class Callable:
def __call__(self, x):
return self.__call__(x)
def __init__(self, func):
self.__call__ = func
これを使用すると、(予想どおり)次のようになります。
>>> a = Callable(lambda x: x**2)
>>> a(3)
9