对象析构函数__del__在Python中何时使用


Posted in Python onMarch 22, 2022

对象析构函数__del__在Python中何时使用

前言:

Python 中的类的构造函数 ​​__init__​​ , 每当实例产生就会调用这个构造函数。

反过来,每当实例对象需要被垃圾收集被收回时,就需要用到析构函数 ​​__del__​​ 。

​​__del__​​ 方法是类的一种特殊方法。可以利用 ​​__del__​​ 方法来清理资源,例如关闭文件。

来看一个例子:

class Life:

    def __init__(self, name='None'):
        print('Hello,' + name)
        self.name = name

    def live(self):
        print(self.name)
    
    def __del__(self):
        print("Goodbye," + self.name)

def main():

    bob = Life('Bob')
    bob.live()

if __name__ == '__main__':
    main()

运行该代码,输出结果为:

Hello,Bob
Bob
Goodbye,Bob

我们得到上面的输出是因为当代码即将结束时,不再需要类 Life,因此它已准备好被销毁。 在类 Life 被销毁之前,会自动调用 ​​__del__​​ 方法。

还可以通过调用 ​​del​​ 手动调用 ​​__del__​​ 方法:

class Life:

    def __init__(self, name='None'):
        print('Hello,' + name)
        self.name = name

    def live(self):
        print(self.name)
    
    def __del__(self):
        print("Goodbye," + self.name)

def main():

    bob = Life('Bob')
    del bob

if __name__ == '__main__':
    main()

执行结果:

Hello,Bob
Goodbye,Bob

值得注意的是:​​del x​​ 并不直接调用 ​​x.__del__()​​ ,前者将 x 的引用计数减一,而后者仅在其引用计数达到零时才被调用。

在 Python 中,任何未使用的对象(如内置类型或类的实例)在不再使用时会自动从内存中删除(移除)。 这种释放和回收未使用内存空间的过程称为垃圾回收。

在Python中何时使用__del__?

重要的是要注意,当对象处于销毁的过程中,调用 ​​__del__​​ 方法(未损坏后),因此仍然可以在__del__方法中访问属性。

由于​​__del__​​ 可以访问对象的数据成员,因此应该确保对象的填充删除,以便没有内存泄露。

class App:
    def __init__(self):
        print("Open App")

    def __del__(self):
        print("Closed App")

class Phone:
    app = None

    def __init__(self):
        print("Switching on the Phone")
        self.__class__.app = App()

    def __del__(self):
        del self.__class__.app
        print("Switching off the Phone")

phone = Phone()

del phone

执行结果:

Switching on the Phone
Open App
Closed App
Switching off the Phone

在这个例子中,如果我们没有在​​__del__​​ 方法中销毁手机的属性 app,它就会留在内存中,导致内存泄漏。

析构函数使用紧要

Python 中的析构函数并不像 C++ 中那样被频繁使用,因为它存在一些众所周知的警告和极少数鲜为人知的暗坑。

尽量减少使用 ​​__del__​​ 函数:

  • 第一,因为 Python 在回收实例时,会自动回收该实例拥有的所有内存空间,所以析构函数并不需要考虑空间管理。所以也就失去了手动写 ​​__del__​​ 的意义。
  • 第二,无法预测一个实例什么时候会被回收。有时候你想触发析构函数时,系统表中对对象的引用会阻止析构函数的执行。Python 也无法保证解释器退出时,一个仍然存在的对象会调用其析构函数。
  • 第三,​​__del__​​ 可能会引发的异常会直接向 sys.stderr(标准错误流) 打印一条警告消息,而不是触发一个异常事件。因为它通过垃圾收集器运行在不可预料的上下文中。
  • 第四,当我们期待垃圾回收时,对象间的循环引用可能会阻止其发生。

总结:

  • 当对象被销毁时,Python 会自动调用对象上的 ​​__del__​​ 方法(​​类似于在对象创建期间调用的 ​​__init__​​ 构造函数)。
  • ​​__del__​​ 方法类似于 C++ 和 Java 中的析构函数。用于销毁对象的状态。
  • Python 中,尽量减少析构函数的使用。

到此这篇关于Python 中的对象析构函数__del__ 详情的文章就介绍到这了,更多相关Python 对象析构函数del内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python中的推导式使用详解
Jun 03 Python
Python中的探索性数据分析(功能式)
Dec 22 Python
微信跳一跳自动运行python脚本
Jan 08 Python
python3 flask实现文件上传功能
Mar 20 Python
python样条插值的实现代码
Dec 17 Python
Python绘制频率分布直方图的示例
Jul 08 Python
python 字符串追加实例
Jul 20 Python
详解Python3 pickle模块用法
Sep 16 Python
解决Tensorflow 使用时cpu编译不支持警告的问题
Feb 03 Python
Python gevent协程切换实现详解
Sep 14 Python
详解python 条件语句和while循环的实例代码
Dec 28 Python
Python调用系统命令os.system()和os.popen()的实现
Dec 31 Python
详解Python内置模块Collections
Mar 22 #Python
Python中 range | np.arange | np.linspace三者的区别
Python中非常使用的6种基本变量的操作与技巧
python使用torch随机初始化参数
Mar 22 #Python
Django基础CBV装饰器和中间件
详解pytorch创建tensor函数
Mar 22 #Python
详解Python+OpenCV绘制灰度直方图
You might like
php 中的4种标记风格介绍
2012/05/10 PHP
初识Laravel
2014/10/30 PHP
php+lottery.js实现九宫格抽奖功能
2019/07/21 PHP
DOM 基本方法
2009/07/18 Javascript
jquery 页面全选框实践代码
2010/04/02 Javascript
JavaScript基本编码模式小结
2012/05/23 Javascript
网页源代码保护(禁止右键、复制、另存为、查看源文件)
2012/05/23 Javascript
JQueryEasyUI datagrid框架的进阶使用
2013/04/08 Javascript
JS实现的表格操作类详解(添加,删除,排序,上移,下移)
2015/12/22 Javascript
基于jquery实现图片相关操作(重绘、获取尺寸、调整大小、缩放)
2015/12/25 Javascript
jQuery配合coin-slider插件制作幻灯片效果的流程解析
2016/05/13 Javascript
基于JavaScript实现前端文件的断点续传
2016/10/17 Javascript
jQuery实现checkbox即点即改批量删除及中间遇到的坑
2017/11/11 jQuery
详解ES6通过WeakMap解决内存泄漏问题
2018/03/09 Javascript
Vue 全局loading组件实例详解
2018/05/29 Javascript
从0到1构建vueSSR项目之node以及vue-cli3的配置
2019/03/07 Javascript
原生js实现each方法实例代码详解
2019/05/27 Javascript
解决微信小程序中的滚动穿透问题
2019/09/16 Javascript
Python的Bottle框架中返回静态文件和JSON对象的方法
2015/04/30 Python
Python遍历指定文件及文件夹的方法
2015/05/09 Python
Python的Flask框架的简介和安装方法
2015/11/13 Python
python 连接sqlite及简单操作
2017/06/30 Python
python3使用scrapy生成csv文件代码示例
2017/12/28 Python
python装饰器-限制函数调用次数的方法(10s调用一次)
2018/04/21 Python
Python实现字典排序、按照list中字典的某个key排序的方法示例
2018/12/18 Python
树莓派与PC端在局域网内运用python实现即时通讯
2019/06/22 Python
在Django admin中编辑ManyToManyField的实现方法
2019/08/09 Python
只要五步 就可以用HTML5/CSS3快速制作便签贴特效(图)
2012/06/04 HTML / CSS
使用PDF.JS插件在HTML中预览PDF文件的方法
2018/08/29 HTML / CSS
贝玲妃美国官方网站:Benefit美国
2016/08/28 全球购物
Zavvi荷兰:英国大型音像制品和图书游戏零售商
2018/03/22 全球购物
财务管理专业应届毕业生求职信
2013/09/22 职场文书
会计出纳员的自我评价
2014/01/15 职场文书
巾帼文明岗申报材料
2014/05/01 职场文书
2019年预备党员的思想汇报:加深对党的认知
2019/09/25 职场文书
Python利用folium实现地图可视化
2021/05/23 Python