Python对象生命周期始于__new__分配内存并返回实例,再由__init__初始化;引用计数归零时立即销毁(__del__可能被调用),但循环引用需gc模块清理;__del__不保证执行,资源清理应优先用with或close()。

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










