Python对象生命周期管理_创建销毁解析【教程】
发布时间 - 2026-01-01 00:00:00 点击率:次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__ 是析构方法,在对象即将被销毁前由解释器调用。但它不保证立即执行,也不保证一定执行——尤其在程序退出、发生严重错误或存在循环引用时。
- 不要依赖 __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) 可辅助排查内存泄漏源头
不复杂但容易忽略
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何在Tomcat中配置并部署网站项目?
CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】
JavaScript如何实现类型判断_typeof和instanceof有什么区别
Java类加载基本过程详细介绍
Python文件异常处理策略_健壮性说明【指导】
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?
零基础网站服务器架设实战:轻量应用与域名解析配置指南
Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制
北京企业网站设计制作公司,北京铁路集团官方网站?
Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南
Python自然语言搜索引擎项目教程_倒排索引查询优化案例
Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】
详解vue.js组件化开发实践
详解jQuery中基本的动画方法
Laravel如何自定义错误页面(404, 500)?(代码示例)
Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】
WordPress 子目录安装中正确处理脚本路径的完整指南
Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面
在Oracle关闭情况下如何修改spfile的参数
Laravel中的Facade(门面)到底是什么原理
5种Android数据存储方式汇总
Python制作简易注册登录系统
Laravel安装步骤详细教程_Laravel环境搭建指南
百度输入法ai组件怎么删除 百度输入法ai组件移除工具
邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?
Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程
JavaScript数据类型有哪些_如何准确判断一个变量的类型
Laravel如何使用Telescope进行调试?(安装和使用教程)
*服务器网站为何频现安全漏洞?
laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法
EditPlus中的正则表达式实战(5)
如何在建站之星绑定自定义域名?
Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册
高防服务器如何保障网站安全无虞?
详解Android中Activity的四大启动模式实验简述
Laravel怎么使用artisan命令缓存配置和视图
Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)
Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布
重庆市网站制作公司,重庆招聘网站哪个好?
佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】
Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知
高性能网站服务器部署指南:稳定运行与安全配置优化方案
Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境
北京网站制作的公司有哪些,北京白云观官方网站?
Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
电视网站制作tvbox接口,云海电视怎样自定义添加电视源?
Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法


/gc处理循环引用)和销毁(__del__不保证可靠调用),理解它可避免内存泄漏、控制资源释放。