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; ?>
】
相关推荐
- Python代码测试策略_质量保障解析【教程】
- Win11怎么把图标拖到任务栏_Win11固定应用
- 如何在 Go 中高效缓存与分发网络视频流
- Windows电脑如何进入安全模式?(多种按键方法
- PHP怎么接收URL中的锚点参数_获取#后面参数值
- 如何使用Golang benchmark测量函数延
- Win10怎么关闭自动更新错误重启 Win10策略
- 如何将竖排文本文件转换为横排字符串
- 如何在 Go 中正确初始化结构体中的 map 字段
- PHP中require语句后直接调用返回对象方法的
- Win11如何设置ipv6 Win11开启IPv6
- 如何在Golang中实现CI/CD流水线自动化测试
- Windows10电脑怎么设置电源按钮_Win10
- 用Python构建微服务架构实践_FastAPI与
- Win11怎么关闭系统声音_Win11系统提示音静
- C++友元类使用场景_C++类间协作设计方式讲解
- c# 如何深拷贝和浅拷贝
- Python高性能计算项目教程_NumPyCyth
- php订单日志怎么记录发货_php记录订单发货操作
- php本地部署支持nodejs吗_php与node
- Mac的Time Machine怎么用_Mac系统
- 如何使用Golang编写单元测试_创建Test函数
- 如何在Golang中使用闭包_封装变量与函数作用域
- Win11输入法选字框不见了怎么办_Win11输入
- php嵌入式日志记录怎么实现_php将硬件数据写入
- PHP主流架构如何处理会话管理_Session与C
- Win11怎么修改DNS服务器 Win11设置DN
- Win11如何隐藏桌面图标 Win11一键隐藏/显
- Linux如何安装Golang环境_Linux下G
- Windows系统被恶意软件破坏后的恢复策略_错误
- Win11怎么设置单手模式_Win11触控键盘布局
- Python与Docker容器化部署实战_镜像构建
- C++如何使用std::optional?(处理可
- Win11如何设置环境变量 Win11添加和修改系
- php8.4新语法match怎么用_php8.4m
- Win10系统怎么查看网络连接状态_Windows
- php和redis连接超时怎么办_phpredis
- 如何使用Golang实现路由参数绑定_使用Mux和
- Win10怎样卸载TeamViewer_Win10
- Win11怎么设置鼠标宏_Win11鼠标按键自定义
- php怎么下载安装后无法解析php文件_服务器配置
- Win11怎么关闭自动调节亮度 Win11禁用内容
- 当网站SEO排名下降时,如何应对?
- Mac如何查看电池健康百分比_Mac系统信息电源检
- Win11怎样安装剪映专业版_Win11安装剪映教
- Win11开机自检怎么关闭_跳过Win11开机磁盘
- Win11怎么查看显卡温度 Win11任务管理器查
- 如何在Golang中处理二进制数据_Golang
- Win11怎么设置指纹解锁 Win11笔记本录入指
- 如何在Golang中处理数据库事务错误_回滚和日志

不只是调用 __init__
QQ客服