Python对象生命周期包括创建(__new__分配内存、__init__初始化)、存活(引用计数为主,weakref/gc处理循环引用)和销毁(__del__不保证可靠调用),理解它可避免内存泄漏、控制资源释放。

Python对象的生命周期从创建开始,到被垃圾回收器销毁结束,中间涉及引用计数、循环引用检测和自定义钩子等机制。理解它,能帮你避免内存泄漏、控制资源释放时机,写出更健壮的代码。
对象创建:不只是调用 __init__
对象创建分两步:先由 __new__ 分配内存并返回实例,再由 __init__ 初始化属性。多数情况下你只写 __init__,但若需控制实例生成(比如单例、不可变对象),就得重写 __new__。
- __new__ 是静态方法,必须返回一个类的实例(通常是 super().__new__(cls))
- __init__ 是实例方法,不返回值;如果它返回非 None 值,Python 会报错
- 如果类定义了 __new__ 但没返回当前类实例,__init__ 根本不会被调用
对象存活:引用计数是主力,但不是全部
CPython 使用引用计数作为主要内存管理机制:每个对象内部记录有多少变量或容器正指向它。当计数降为 0,对象立即被销毁(__del__ 可能被触发)。
- 赋值、放入列表/字典、作为参数传入函数……都会使引用计数 +1
- del 变量、离开作用域、从容器中移除……通常使引用计数 -1
- 可用 sys.getrefcount(obj) 查看当前引用数(注意:该函数调用本身会临时 +1)
对象销毁:何时触发 __del__?它可靠吗?
__del__ 是析构方法,在对象即将被销毁前由解释器调用。但它不保证立即执行,也不保证一定执行——尤其在程序退出、发生严重错误或存在循环引用时。
立即学习“Python免费学习笔记(深入)”;
- 不要依赖 __del__ 关闭文件、释放网络连接等关键操作;应优先使用 with 语句或显式 .close()
- __del__ 中避免访问全局变量或其它可能已被销毁的对象,否则易引发异常且难以调试
- 若需确定性清理,推荐 contextlib.contextmanager 或继承 contextlib.AbstractContextManager
打破循环引用:weakref 和 gc 模块
两个对象互相持有强引用(如父对象存子对象,子对象又存父对象),引用计数永远不为 0,CPYthon 的引用计数机制就无法释放它们。这时靠 gc 模块的循环检测器来清理。
- 导入 import gc 后可手动调用 gc.collect() 触发回收(一般不需要)
- 更推荐用 weakref.ref 或 weakref.WeakKeyDictionary 替代强引用,让某一方“弱持有”,从而避免循环
- 用 gc.get_objects() 或 gc.get_referrers(obj) 可辅助排查内存泄漏源头
不复杂但容易忽略










