对象析构函数__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操作时间和日期之asctime()方法的使用
May 22 Python
详解python开发环境搭建
Dec 16 Python
解决python读取几千万行的大表内存问题
Jun 26 Python
详解flask表单提交的两种方式
Jul 21 Python
Python脚本完成post接口测试的实例
Dec 17 Python
基于python框架Scrapy爬取自己的博客内容过程详解
Aug 05 Python
pycharm如何实现跨目录调用文件
Feb 28 Python
Django 5种类型Session使用方法解析
Apr 29 Python
Pycharm快捷键配置详细整理
Oct 13 Python
用Python自动清理系统垃圾的实现
Jan 18 Python
python+selenium自动化实战携带cookies模拟登陆微博
Jan 19 Python
python可视化分析绘制带趋势线的散点图和边缘直方图
Jun 25 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巧获服务器端信息
2006/12/06 PHP
PHP mcrypt可逆加密算法分析
2011/07/19 PHP
php+iframe实现隐藏无刷新上传文件
2012/02/10 PHP
windows7下安装php的php-ssh2扩展教程
2014/07/04 PHP
PHP实现简单的新闻发布系统实例
2015/07/28 PHP
WordPress开发中用于标题显示的相关函数使用解析
2016/01/07 PHP
PHP实现根据时间戳获取周几的方法
2016/02/26 PHP
JavaScript面象对象设计
2008/04/28 Javascript
JavaScript Prototype对象
2009/01/07 Javascript
js 关键词高亮(根据ID/tag高亮关键字)案例介绍
2013/01/21 Javascript
javascript学习笔记(一)基础知识
2014/09/30 Javascript
JavaScript字符串对象toUpperCase方法入门实例(用于把字母转换为大写)
2014/10/17 Javascript
基于JS实现EOS隐藏错误提示层代码
2016/04/25 Javascript
Vue实现双向绑定的方法
2016/12/22 Javascript
JavaScript实现简单的计算器
2020/01/16 Javascript
微信小程序调用wx.getImageInfo遇到的坑解决
2020/05/31 Javascript
SpringBoot+Vue开发之Login校验规则、实现登录和重置事件
2020/10/19 Javascript
[46:10]2014 DOTA2国际邀请赛中国区预选赛 CnB VS HGT
2014/05/21 DOTA
将图片文件嵌入到wxpython代码中的实现方法
2014/08/11 Python
使用python3.5仿微软记事本notepad
2016/06/15 Python
python实现指定文件夹下的指定文件移动到指定位置
2018/09/17 Python
微信小程序python用户认证的实现
2019/07/29 Python
Anconda环境下Vscode安装Python的方法详解
2020/03/29 Python
使用Tensorflow-GPU禁用GPU设置(CPU与GPU速度对比)
2020/06/30 Python
Python使用pyexecjs代码案例解析
2020/07/13 Python
英国著名的化妆品折扣网站:Allbeauty.com
2016/07/21 全球购物
如何写出高性能的JSP和Servlet
2013/01/22 面试题
实习教师自我鉴定
2013/12/09 职场文书
共产党员公开承诺书
2014/03/25 职场文书
思想作风整顿个人剖析材料
2014/10/06 职场文书
县人大领导班子四风对照检查材料思想汇报
2014/10/09 职场文书
2014年宣传部个人工作总结
2014/12/06 职场文书
解除劳动合同通知书范本
2015/04/16 职场文书
任命书格式范文
2015/09/22 职场文书
星际争霸:毕姥爷vs解冻01
2022/04/01 星际争霸
解决Mysql中的innoDB幻读问题
2022/04/29 MySQL