类的__call__
dunder方法应该表示运算符()
,对吗?如果是这样,为什么下面的代码没有按预期工作?
def f():
print("hello world")
f()
>>>hello world
f.__call__ = lambda: print("foo") #replace the call operator
f()
>>>hello world
f.__call__()
>>>foo
<class 'function'>
发生了一些特别的事情有人能阐明这个问题吗?
您没有更改类的__call__
方法。您已经更改了类实例的__call__
方法。这就是区别。您需要更改函数类的__call__
方法,当然这不是您真正想要做的
关于这一点的文件很简洁:
Class Instances
Instances of arbitrary classes can be made callable by defining
a __call__() method in their class.
它特别地说";在他们的类中";,而不是";在实例"中;。这只是Python方面的一个设计决定。你可以想象,如果一个类的不同实例在这种情况下表现不同,会有多令人困惑。