You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 10:42:23