Python中__new__是否覆盖__init__?派生类__init__未执行疑问
Python中__new__与__init__的关系及派生类__init__未执行的原因
一、new__不会覆盖__init
__new__和__init__是Python对象创建流程中两个不同阶段的方法,不存在“覆盖”关系:
- __new__是类方法,参数为
cls(当前类对象),负责创建并返回实例对象,是实例生成的第一步。 - init__是实例方法,参数为
self(已创建的实例),负责初始化实例属性,只有当__new__返回当前类(或其子类)的实例时,Python才会自动调用__init。
二、你的代码中派生类__init__未执行的原因
看你写的Derived_Demo类的__new__方法:
def __new__(self): print("Derived_Demo's __new__() invoked")
这里存在两个关键问题:
- __new__的参数错误:__new__的第一个参数应该是
cls(类对象),而非self(实例对象)——因为调用__new__时实例还未创建,self根本不存在。 - 没有返回实例对象:你的__new__只执行了打印操作,既没有调用父类的__new__来创建实例,也没有返回任何实例。Python的规则是:只有当__new__返回当前类的实例时,才会自动触发__init__的调用。由于你的__new__没有返回实例,__init__自然不会执行。
另外,你的Demo类的__new__写法也有误:手动调用self.__init__(self)是多余且错误的,正常流程中Python会自动在__new__返回实例后调用__init__,不需要手动触发。
三、修正后的代码示例
class Demo: def __new__(cls): # 正确使用cls作为参数 instance = super().__new__(cls) # 调用父类__new__创建实例 print("Demo's __new__() invoked") return instance # 返回实例,触发后续__init__调用 def __init__(self): print("Demo's __init__() invoked") class Derived_Demo(Demo): def __new__(cls): print("Derived_Demo's __new__() invoked") return super().__new__(cls) # 调用父类__new__创建并返回实例 def __init__(self): print("Derived_Demo's __init__() invoked") def main(): obj1 = Derived_Demo() obj2 = Demo() main()
执行结果:
Derived_Demo's __new__() invoked Demo's __new__() invoked Derived_Demo's __init__() invoked Demo's __new__() invoked Demo's __init__() invoked
总结
- __new__和__init__是协作关系,而非覆盖关系,前者创建实例,后者初始化实例。
- 派生类__init__未执行的核心原因是其__new__没有返回当前类的实例,导致Python无法触发__init__的自动调用。
内容的提问来源于stack exchange,提问作者DCR
相关产品推荐
相关产品推荐

