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.refweakref.WeakKeyDictionary 替代强引用,让某一方“弱持有”,从而避免循环
  • gc.get_objects()gc.get_referrers(obj) 可辅助排查内存泄漏源头

不复杂但容易忽略


# python  # 作用域  # 垃圾回收器 


相关栏目: 【 网站优化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软删除与数据恢复方法