类的__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'>正在发生一些特别的事情,有人能照亮这个问题吗?
发布于 2022-09-05 06:02:44
您没有更改类的__call__方法。您已经更改了类实例的__call__方法。这就是区别所在。您需要更改函数类的__call__方法,这当然不是您真正想要的。
关于这方面的文件很简短:
Class Instances
Instances of arbitrary classes can be made callable by defining
a __call__() method in their class.它明确地说“在他们的类”,而不是“在实例中”。这只是Python的设计决定。您可以想象,如果一个类的不同实例在这种情况下的行为是不同的,那么它将是多么的混乱。
https://stackoverflow.com/questions/73601861
复制相似问题