为何f.__call__()与f()执行结果不同?Python function类解析
函数实例的__call__属性无法覆盖调用行为的原因
先看你给出的代码示例:
def f(): print("hello world") f() >>>hello world f.__call__ = lambda: print("foo") # 替换调用运算符 f() >>>hello world f.__call__() >>>foo
原因很直白:Python里所有函数都是<class 'function'>的实例,而()运算符的执行逻辑是由函数类(function)层面的__call__方法定义的,和函数实例自身的__call__属性无关。
当你执行f()时,Python实际调用的是function.__call__(f)——也就是去函数类的__call__方法里找执行逻辑,完全不会读取f实例自己的__call__属性。你给f.__call__赋值,只是给这个函数实例新增了一个普通属性,根本不会改变类层面的__call__实现,所以f()还是会执行原来的函数体。
而直接调用f.__call__()时,你是在调用这个实例上新增的lambda属性,自然会输出foo。
内容的提问来源于stack exchange,提问作者DB3D
相关产品推荐
相关产品推荐

