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

关于Python元类中__call__方法执行时机的疑问求助

你的误解核心:元类的__call__并非用于创建类本身

你搞混了元类不同方法的触发时机——元类的__call__方法根本不是用来创建类对象的,它的作用是控制类实例的创建过程。

关键触发时机拆解:

  • 当Python解释器处理class Sample(metaclass=CustomMetaClass):这段类定义代码时,实际是调用元类的**new方法生成Sample这个类对象,接着调用元类的init**方法完成类的初始化配置。这个阶段完全不会触发元类的__call__方法,所以你看不到打印语句。
  • 只有当你调用Sample类(也就是执行Sample())的时候,才会触发元类的__call__方法。元类的__call__默认逻辑是:先调用类的__new__创建实例对象,再调用类的__init__初始化实例,最后返回实例。你重写了元类的__call__,所以执行Sample()时会触发你写的打印,但因为你没返回实例,此时Sample()实际上得不到可用的实例对象。

验证代码示例

给元类补充__new__和__init__方法,就能看到类定义阶段的触发行为:

class CustomMetaClass(type):
    def __new__(cls, name, bases, attrs):
        print("Custom __new__ method invoked when defining the class.")
        return super().__new__(cls, name, bases, attrs)
    
    def __init__(self, name, bases, attrs):
        print("Custom __init__ method invoked when defining the class.")
        super().__init__(name, bases, attrs)
    
    def __call__(self, *args, **kwargs):
        print("Custom call method is invoked from custom meta class.")
        # 恢复默认实例创建逻辑,才能得到可用的Sample实例
        instance = self.__new__(self, *args, **kwargs)
        self.__init__(instance, *args, **kwargs)
        return instance

class Sample(metaclass=CustomMetaClass):
    def method(self):
        print("Printing from a method")

运行这段代码时,定义Sample类的瞬间会打印__new__和__init__的语句;执行Sample()时才会打印__call__的语句。

内容的提问来源于stack exchange,提问作者user3103957

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 07:43:13