Python对象生命周期管理_创建销毁解析【教程】
技术百科
冷炫風刃
发布时间:2026-01-01
浏览: 次 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) 可辅助排查内存泄漏源头
不复杂但容易忽略
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- windows如何禁用驱动程序强制签名_windo
- Windows系统被恶意软件破坏后的恢复策略_错误
- PHP主流架构怎么处理表单验证_规则与自定义【技巧
- mac怎么安装adb_MAC配置Android A
- Win11怎么恢复误删照片_Win11数据恢复工具
- Windows10系统怎么查看防火墙状态_Win1
- 如何使用Golang实现微服务事件驱动_使用消息总
- Mac如何备份到iCloud_Mac桌面与文稿文件
- Win11如何设置电源计划_Win11电源计划优化
- 如何使用Golang reflect检查方法数量_
- Windows11怎么用“记事本”自动换行与编码
- Win11如何设置系统声音_Win11系统声音调整
- Win11怎么快速锁屏_Win11一键锁屏快捷键W
- Win10怎么查看内存时序参数_Win10CPU-
- Win11如何暂停系统更新 Win11暂停更新最长
- 如何用列表一次性对 DataFrame 的指定列应
- php能控制zigbee模块吗_php通过串口与c
- LINUX如何开放防火墙端口_Linux fire
- windows系统如何安装cab更新补丁_wind
- Go 中 defer 在 goroutine 内部
- Python装饰器设计思路_功能增强机制说明【指导
- 使用类变量定义字符串常量时的类型安全最佳实践
- Win11摄像头无法使用怎么办_Win11相机隐私
- Win11怎么开启窗口对齐助手_Windows11
- Python类装饰器使用_元编程解析【教程】
- c++怎么操作redis数据库_c++ hired
- 如何使用正则表达式批量替换重复的“-”模式为固定字
- php打包exe后无法读取环境变量_变量配置方法【
- Mac的“调度中心”与“空间”怎么用_Mac多桌面
- Python列表推导式与字典推导式教程_简化代码高
- 如何使用Golang实现云原生应用弹性伸缩_自动应
- 如何使用Golang实现函数指针_函数变量与回调示
- Win11怎么压缩文件 Win11自带压缩解压功能
- php8.4如何配置ssl证书_php8.4htt
- Windows10如何更改鼠标灵敏度_Win10鼠
- 如何提升Golang程序I/O性能_Golang
- PHP接收参数值为空怎么办_判断和处理空参数方法说
- c# F# 的 MailboxProcessor
- Python数据挖掘核心算法实践_聚类分类与特征工
- windows如何备份注册表_windows导出和
- Win11文件扩展名怎么显示 Win11查看文件后
- Win11如何设置省电模式 Win11开启电池节电
- 静态属性修改会影响所有实例吗_php作用域操作符下
- 如何使用Golang实现容器健康检查_监控和自动重
- Win11如何添加/删除输入法 Win11切换中英
- Win10电脑怎么设置网络名称_Windows10
- C#怎么创建控制台应用 C# Console Ap
- php8.4xdebug无法调试怎么办_php8.
- Win11怎么关闭触控板_Win11笔记本禁用触摸
- Python对象比较与排序_魔术方法解析【教程】

不只是调用 __init__
QQ客服