1

次のコードを取得しました。

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
4

0 に答える 0