__new__是真正的构造函数,负责创建实例;__new__先于__init__调用,返回本类实例后才触发__init__,后者仅作初始化且需显式调用父类方法。

Python中__init__方法不是类的“构造函数”,而是实例创建后的初始化钩子;真正负责对象创建的是__new__。理解这个区别,才能理清初始化的实际执行顺序。
__new__ 先于 __init__ 被调用
__new__是静态方法,负责分配内存并返回新实例;只有它成功返回一个该类的实例后,__init__才会被自动调用。如果__new__返回的是其他类的实例(或根本没返回),__init__将不会执行。
- 自定义
__new__时,务必记得调用super().__new__(cls)获取实例 - 若在
__new__中返回了缓存对象(如单例模式),__init__仍会运行——这可能导致重复初始化,需手动防护
父类 __init__ 不会自动执行
Python不会像Java那样隐式调用父类构造器。__init__只是普通实例方法,必须显式通过super().__init__()或ParentClass.__init__(self, ...)触发父类逻辑。
- 遗漏
super().__init__()是常见错误,会导致父类字段未初始化、装饰器失效、Mixin行为缺失等问题 - 多继承时推荐用
super(),它按MRO顺序调用,避免重复或跳过
__init__ 中可安全访问 self 和属性
此时对象已由__new__创建完成,self是有效的实例,可以赋值实例属性、调用实例方法、触发描述符__set__等。
立即学习“Python免费学习笔记(深入)”;
- 但要注意:若父类
__init__未执行,其定义的属性(如self.name)尚未存在,直接访问会报AttributeError - 不建议在
__init__中做耗时操作或I/O,影响实例化性能;复杂初始化可拆到单独的.setup()方法
异常会中断初始化流程
若__init__抛出异常,实例对象仍会被创建(__new__已完成),但不会被绑定到变量(除非捕获异常),且__del__可能被调用。
- 未被引用的异常中断实例会被垃圾回收,但资源(如打开的文件、网络连接)若未在
__init__中妥善清理,可能泄漏 - 建议用
try/finally或上下文管理器确保关键资源释放,或把易错逻辑移到独立方法中处理










