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

为何将__call__方法声明为classmethod后无法生效?

为什么将类的__call__声明为classmethod后,调用Foo()无法正常运行?

核心原因:Foo()是实例化操作,不会触发你定义的__call__方法

当你调用Foo()时,本质是实例化类创建对象,这个过程由Python的元类(默认是type)的__call__方法控制,它会依次执行:

  • 调用类的__new__创建实例
  • 调用类的__init__初始化实例
  • 返回创建好的实例

你在Foo类中定义的__call__方法,哪怕不加@classmethod,也不会在Foo()时被触发——因为__call__特殊方法的作用是让类的实例变成可调用对象,而非控制类本身的实例化。

被装饰为classmethod后的__call__怎么用?

把__call__标记为classmethod后,它变成了类绑定的方法,你需要直接通过类调用它才会执行:

Foo.__call__()  # 这会打印出0

如果是常规的__call__用法(让实例可调用),应该去掉@classmethod:

class Foo:
    bar = 0
    def __call__(self):
        print(self.bar)

foo = Foo()
foo()  # 此时调用实例会触发__call__,打印0

总结

  • Foo()是实例化操作,由元类的__call__处理,和你定义的类级__call__无关
  • __call__的设计初衷是赋予实例可调用能力,标记为classmethod违背了这个设计逻辑,也改变了它的触发时机

内容的提问来源于stack exchange,提问作者gld.g

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 06:47:08