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

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")

这里存在两个关键问题:

  1. __new__的参数错误:__new__的第一个参数应该是cls(类对象),而非self(实例对象)——因为调用__new__时实例还未创建,self根本不存在。
  2. 没有返回实例对象:你的__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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 01:11:23