Python类初始化顺序_init执行流程解析

3次阅读

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

Python类初始化顺序_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或上下文管理器确保关键资源释放,或把易错逻辑移到独立方法中处理
text=ZqhQzanResources