Python对象生命周期始于__new__分配内存和__init__初始化,依赖引用计数与GC处理循环引用,销毁前可能调用__del__(不保证执行),推荐用weakref和显式资源管理替代依赖__del__。
Python对象的生命周期从创建开始,到被垃圾回收结束,中间涉及引用计数、循环引用检测和析构方法调用等机制。理解这些过程,有助于写出内存更可控、行为更可预期的代码。
每次执行 MyClass() 时,Python 先调用 __new__ 分配内存并返回实例对象,再调用 __init__ 初始化该对象。注意:__new__ 是静态方法,必须显式返回实例;而 __init__ 不返回值(或隐式返回 None)。
__new__,务必调用父类的 __new__(如 super().__new__(cls)),否则不会真正创建对象__init__ 只负责初始化已有对象,不能控制对象是否生成str、tuple)常通过重写 __new__ 实现自定义构造逻辑CPython 主要依赖引用计数:每个对象内部记录被多少变量、容器或属性引用。当引用数降为 0,对象立即被销毁并调用 __del__(如果存在)。但引用计数无法处理循环引用,这时需要 GC 模块定期扫描并清理。
sys.getrefcount(obj) 可查看当前引用数(注意:传参本身会+1)gc.collect() 手动触发一次回收,调试时可设 gc.set_debug(gc.DEBUG_STATS) 观察回收行为__del__ 是对象被销毁前最后执行的方法,但它不保证一定被调用,也不保证调用时机——尤其在解释器关闭、全局命名空间被清空或发生严重异常时可能跳过。
__del__ 中避免
调用可能引发异常的操作(如文件 I/O、网络请求),也不要依赖它释放关键资源__del__ 中重新创建对自身的引用(如放进全局列表),这会阻止对象被回收with)或显式 close() 方法管理资源,__del__ 仅作兜底当需要打破循环引用、延迟清理或构建缓存结构时,weakref 模块提供安全的间接访问方式;del 语句则用于显式解除局部引用。
weakref.ref(obj) 返回一个弱引用对象,不增加原对象引用计数weakref.WeakKeyDictionary 和 WeakValueDictionary 适合实现缓存,键或值被回收后自动清理条目del var 只是删除名字绑定,不直接销毁对象;只有该对象所有引用都被清除后,才进入回收流程
相关栏目:
【
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
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。