我有以下代码:
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