Python对象生命周期始于__new__分配内存并返回实例,再由__init__初始化;引用计数归零时立即销毁(__del__可能被调用),但循环引用需gc模块清理;__del__不保证执行,资源清理应优先用with或close()。
Python对象的生命周期从创建开始,到被垃圾回收器销毁结束。理解这个过程,关键在于掌握对象如何被创建、引用计数如何变化、何时触发销毁,以及__del__的真实行为边界。
__init__
对象创建实际分两步:先由__new__分配内存并返回实例,再由__init__初始化属性。大多数情况下无需重写__new__,但若需控制实例生成(如单例、不可变类型),就必须介入。
__new__是静态方法,第一个参数是类本身(cls),必须返回一个该类或其子类的实例__init__是实例方法,接收刚创建的实例(self),负责设置初始状态,不返回值(或隐式返回None)__new__返回的不是当前类的实例,Python会跳过__init__调用
CPython使用引用计数为主、循环检测为辅的垃圾回收机制。对象是否被销毁,取决于它是否还被“可达”——即是否存在从根对象(如全局变量、栈帧局部变量)出发的引用链。
del、从容器移除,引用计数−1__del__可能被调用),内存同步释放gc模块的周期性扫描来清理__del__不是析构函数:它的限制与替代方案__del__在对象即将被销毁前由解释器调用,但它不保证执行时机,也不保证一定执行。尤其在程序退出、解释器关闭阶段,__del__可能被跳过。
__del__中依赖其他对象(它们可能已被销毁或处于不确定状态)with语句)或显式close()方法可通过sys.getrefcount()观察引用计数变化(注意:传入对象本身会使计数临时+1),也可用gc.get_objects()查看当前存活对象,辅助定位泄漏。
weakref.ref(),避免阻碍垃圾回收gc.collect(),但通常无需手动调用gc.set_debug(gc.DEBUG_UNCOLLECTABLE)可打印无法回收的循环引用对象