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; ?>
】
相关推荐
- PHP 中 require() 语句返回值的用法详
- Python文件管理规范_工程实践说明【指导】
- Mac的Time Machine怎么用_Mac系统
- c++怎么处理多线程死锁_c++ lock_gua
- Win11怎么更改盘符_Win11磁盘管理修改驱动
- php命令行怎么运行_通过CLI模式执行PHP脚本
- Mac如何与安卓手机传文件_Mac和Android
- PythonPandas数据分析教程_数据清洗与处
- Win11怎么设置屏保_Windows 11屏幕保
- Win11屏幕亮度突然变暗怎么解决_自动变暗问题处
- Windows10如何查看保存的WiFi密码_Wi
- 用lighttpd能运行php吗_lighttpd
- 如何在 Go 中创建包含 map 的 slice(
- Win11怎么退出高对比度模式_Win11取消反色
- Win11如何暂停系统更新 Win11暂停更新最长
- 如何开启Windows的远程服务器管理工具(RSA
- c++ try_emplace用法_c++ map
- PHP 中如何在函数内持久修改引用变量所指向的目标
- mac怎么查看wifi密码_MAC查看已连接WiF
- 手机php文件怎么变成mp4_安卓苹果打开php转
- Win11怎么快速锁屏_Win11一键锁屏快捷键W
- Windows资源管理器总是卡顿或重启怎么办?(修
- 为什么本地php环境运行php脚本卡顿_php执行
- Windows10怎么用“讲述人”读屏辅助 Win
- 如何使用Golang开发基础文件下载功能_Gola
- Python高性能计算项目教程_NumPyCyth
- Python实现图数据库操作_Neo4j核心CRU
- VSC怎样在Linux运行PHP_Ubuntu系统
- Windows10如何更改日期格式_Win10区域
- Windows如何查看和管理已安装的字体?(字体文
- c++ namespace命名空间用法_c++避免
- Win11如何设置文件关联 Win11修改特定文件
- mac本地php环境如何开启curl_curl扩展
- Win11怎么开启剪贴板历史记录_Windows1
- php转mp4怎么设置帧率_调整php生成mp4视
- 如何在Golang中写入XML文件_生成符合规范的
- php在Linux怎么部署_LNMP环境搭建PHP
- Windows10怎么备份注册表_Windows1
- Win11怎么设置任务栏大小_Windows11注
- PHP主流架构怎么集成Redis缓存_配置步骤【方
- php订单日志怎么按状态筛选_php筛选不同状态订
- Windows驱动无法加载错误解决方法_驱动签名验
- PHP主流架构怎么监控运行状态_工具推荐【操作】
- 如何解决同一段404代码在不同主机上表现不一致的问
- Mac如何将HEIC图片格式转为JPG_Mac批量
- Mac如何修改Hosts文件?(本地开发与屏蔽网站
- 本地php环境出现502错误_nginx或apac
- Python多线程使用规范_线程安全解析【教程】
- c# 在ASP.NET Core中管理和取消后台任
- c# 如何用c#实现一个支持优先级的任务队列

不只是调用 __init__
QQ客服