在Python 2和Python 3中代码:
class Foo(object):
pass
f = Foo()
f.__call__ = lambda *args : args
f(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)
返回错误Foo object is not callable.为什么会这样?
PS:对于旧式的类,它按预期工作.
PPS:此行为是有意的(请参阅接受的答案).作为一种解决方法,可以定义一个__call__类级别,它只是转发给另一个成员,并将这个"普通"成员设置为每个实例的__call__实现.
使用以下代码:
import types
class Foo():
def __getitem__(self, x):
return x
def new_get(self, x):
return x + 1
x = Foo()
x.__getitem__ = types.MethodType(new_get, x)
Run Code Online (Sandbox Code Playgroud)
x.__getitem__(42)将返回43,但x[42]将返回42。
有没有一种方法可以__getitem__在Python实例级别进行覆盖?