关于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
相关产品推荐
相关产品推荐

