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