Python对象生命周期管理_创建销毁说明【指导】


Python对象生命周期始于__new__分配内存和__init__初始化,依赖引用计数与GC处理循环引用,销毁前可能调用__del__(不保证执行),推荐用weakref和显式资源管理替代依赖__del__。

Python对象的生命周期从创建开始,到被垃圾回收结束,中间涉及引用计数、循环引用检测和析构方法调用等机制。理解这些过程,有助于写出内存更可控、行为更可预期的代码。

对象创建:调用类时触发__new____init__

每次执行 MyClass() 时,Python 先调用 __new__ 分配内存并返回实例对象,再调用 __init__ 初始化该对象。注意:__new__ 是静态方法,必须显式返回实例;而 __init__ 不返回值(或隐式返回 None)。

  • 若重写 __new__,务必调用父类的 __new__(如 super().__new__(cls)),否则不会真正创建对象
  • __init__ 只负责初始化已有对象,不能控制对象是否生成
  • 不可变类型(如 strtuple)常通过重写 __new__ 实现自定义构造逻辑

对象存活:靠引用计数 + 垃圾回收器(GC)协同维持

CPython 主要依赖引用计数:每个对象内部记录被多少变量、容器或属性引用。当引用数降为 0,对象立即被销毁并调用 __del__(如果存在)。但引用计数无法处理循环引用,这时需要 GC 模块定期扫描并清理。

  • 使用 sys.getrefcount(obj) 可查看当前引用数(注意:传参本身会+1)
  • 循环引用常见于父子对象互相持有对方引用、闭包捕获自身、缓存结构误用等场景
  • 可通过 gc.collect() 手动触发一次回收,调试时可设 gc.set_debug(gc.DEBUG_STATS) 观察回收行为

对象销毁:何时调用__del__?有哪些限制?

__del__ 是对象被销毁前最后执行的方法,但它不保证一定被调用,也不保证调用时机——尤其在解释器关闭、全局命名空间被清空或发生严重异常时可能跳过。

  • __del__ 中避免调用可能引发异常的操作(如文件 I/O、网络请求),也不要依赖它释放关键资源
  • 不要在 __del__ 中重新创建对自身的引用(如放进全局列表),这会阻止对象被回收
  • 推荐用上下文管理器(with)或显式 close() 方法管理资源,__del__ 仅作兜底

手动干预生命周期:弱引用与显式删除

当需要打破循环引用、延迟清理或构建缓存结构时,weakref 模块提供安全的间接访问方式;del 语句则用于显式解除局部引用。

  • weakref.ref(obj) 返回一个弱引用对象,不增加原对象引用计数
  • weakref.WeakKeyDictionaryWeakValueDictionary 适合实现缓存,键或值被回收后自动清理条目
  • del var 只是删除名字绑定,不直接销毁对象;只有该对象所有引用都被清除后,才进入回收流程


# python  # 垃圾回收器 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化76771 】 【 技术知识130152 】 【 IDC云计算60162 】 【 营销推广131313 】 【 AI优化88182 】 【 百度推广37138 】 【 网站推荐60173 】 【 精选阅读31334


相关推荐: Python代码测试策略_质量保障解析【教程】  Python对象比较排序规则_集合使用说明【指导】  如何在Golang中处理二进制数据_Golang io与encoding/binary二进制操作方法  Python面向对象实战讲解_类与设计模式深入理解  Win11怎么开启移动热点_Windows11共享网络给手机设置教程  如何用正则表达式精确匹配“start”到“end”之间最多含一个换行符的文本段  如何快速验证Golang安装是否成功_运行go version和hello world示例  Win11怎么更改任务栏位置_修改注册表将Win11任务栏置顶【教程】  Python函数参数高级用法_默认值与可变参数解析【教程】  Windows10系统怎么查看显卡型号_Win10 dxdiag显示选项卡  C++中的constexpr和const有什么区别?(编译期常量)  php中::能访问全局变量吗_全局作用域与类作用域区分【操作】  VSC怎么配置PHP的Xdebug_远程调试设置步骤【详解】  Win11输入法切换快捷键怎么改_Windows 11自定义语言切换键位【教程】  如何诊断并终止卡死的 multiprocessing 子进程  Flask 表单数据通过 SMTP 发送邮件的完整实现教程  php怎么下载安装后设置默认字符集_utf8配置步骤【详解】  Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】  Win11怎么更改电脑名称_Windows 11修改计算机名操作指南【步骤】  Win11玩游戏全屏闪退怎么办_Win11全屏优化禁用设置【教程】  如何使用Golang反射将map转换为struct_Golang reflect类型映射技巧  Win11如何暂停系统更新 Win11暂停更新最长时限设置【步骤】  Win10怎么设置开机密码_Windows10账户登录密码设置与取消  如何在Golang中理解指针比较_Golang地址比较与相等判断  c++怎么实现大文件的分块读写_c++ 文件指针seekp与seekg偏移控制【方法】  Python实现图数据库操作_Neo4j核心CRUD与图算法解析  如何在JavaScript中动态拼接PHP的base_url与JS变量  Python技术债务管理_长期维护解析【教程】  Win11怎么关闭透明效果_Windows11个性化颜色关闭透明  Win11怎么关闭自动调节亮度_Windows11禁用内容自适应亮度  Windows怎样关闭桌面弹窗广告_Windows关闭桌面弹窗设置【教程】  Go 中 defer 语句在 goroutine 内部不返回时不会执行  Win11怎么关闭应用权限_Windows11相机麦克风隐私管理  Win11时间不对怎么同步_Win11自动校准互联网时间【设置】  Win11怎样安装企业微信_Win11安装企业微信教程【步骤】  c++ atoi和atof函数用法_c++字符数组转数字  Win10怎样安装Excel数据分析工具_Win10安装分析工具包步骤【教程】  Windows10怎么查看硬件信息_Windows10硬件信息查询方法【指南】  php条件判断怎么写_ifelse和switchcase的使用区别【对比】  Python列表推导式与字典推导式教程_简化代码高效写法  Win11怎么设置任务栏图标大小_Windows11注册表TaskbarSi修改  Win10如何优化内存使用_Win10内存优化技巧【攻略】  Win11怎么更改账户头像_Windows 11自定义用户头像图片设置【步骤】  php8.4如何实现队列任务_php8.4redis队列简单实现方法【教程】  C#怎么创建控制台应用 C# Console App项目创建方法  如何在Golang中实现并发消息队列消费者_Golang channel消息消费实践  c++如何使用std::bitset进行位图算法_c++ 快速查找与大规模数据排重【方法】  Windows7如何安装系统镜像_Windows7系统安装教程【步骤】  c++的static关键字有什么用 静态变量和静态函数的应用场景【教程】  Windows10如何更改盘符名称_Win10重命名硬盘分区卷标 

 2026-01-01

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.