Python对象中__del__方法起作用的条件详解


Posted in Python onNovember 01, 2018

对象的__del__是对象在被gc消除回收的时候起作用的一个方法,它的执行一般也就意味着对象不能够继续引用。

示范代码如下:

class Demo:

def __del__(self):

  print("calling __del__")
 
obj = Demo()

del obj

程序执行结果如下:

grey@DESKTOP-3T80NPQ:/mnt/e/01_workspace/02_programme_language/03_python/03_OOP/2017/08$python del_method.py

calling __del__

但是,这并不是让__del__执行的唯一方式。其实,这个方法也可以直接调用。测试代码如下:

class Demo:

def __init__(self):

  print("calling __del__")

obj = Demo()

obj.__del__()

程序执行结果:

grey@DESKTOP-3T80NPQ:/mnt/e/01_workspace/02_programme_language/03_python/03_OOP/2017/08$python del_method.py

calling __del__

但是,这样的执行很多时候并不能够保证垃圾回收的正常执行。

如下代码:

grey@DESKTOP-3T80NPQ:/mnt/e/01_workspace/02_programme_language/03_python/03_OOP/2017/08$python del_method.py

calling __del__

calling __del__

执行结果:

grey@DESKTOP-3T80NPQ:/mnt/e/01_workspace/02_programme_language/03_python/03_OOP/2017/08$python del_method.py

calling __del__

calling __del__

推测:上面的删除方法触发了两次删除,但是由于引用关系,删除销毁其实没有实现。

修改代码验证如下:

class Demo:

def __del__(self):

  print("calling __del__")

  del self

 

obj = Demo()

obj.__del__()

print(id(obj))

执行结果:

grey@DESKTOP-3T80NPQ:/mnt/e/01_workspace/02_programme_language/03_python/03_OOP/2017/08$python del_method.py

calling __del__

140726800222040

calling __del__

从上面看来,其实主要还有对对象的引用,这个销毁的动作还是需要等待对象引用没有了以后才能够完成。进一步验证代码:

class Demo:

def __del__(self):

  print("calling __del__")

  del self

 

obj = Demo()

obj.__del__()

print(id(obj))

print(id(obj))

执行结果:

grey@DESKTOP-3T80NPQ:/mnt/e/01_workspace/02_programme_language/03_python/03_OOP/2017/08$python del_method.py

calling __del__

140568015406936

140568015406936

calling __del__

从上面结果看,猜测还是准确的。

以上这篇Python对象中__del__方法起作用的条件详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python的ORM框架SQLObject入门实例
Apr 28 Python
详解Python中的循环语句的用法
Apr 09 Python
Python读取Word(.docx)正文信息的方法
Mar 15 Python
Python txt文件加入字典并查询的方法
Jan 15 Python
Python3.5基础之NumPy模块的使用图文与实例详解
Apr 24 Python
Python 控制终端输出文字的实例
Jul 12 Python
python cumsum函数的具体使用
Jul 29 Python
Python检查 云备份进程是否正常运行代码实例
Aug 22 Python
python使用配置文件过程详解
Dec 28 Python
Python基于Socket实现简单聊天室
Feb 17 Python
使用matplotlib动态刷新指定曲线实例
Apr 23 Python
python利用appium实现手机APP自动化的示例
Jan 26 Python
对Python2与Python3中__bool__方法的差异详解
Nov 01 #Python
对Python中for复合语句的使用示例讲解
Nov 01 #Python
使用Python获取网段IP个数以及地址清单的方法
Nov 01 #Python
使用Python获取并处理IP的类型及格式方法
Nov 01 #Python
使用Python进行目录的对比方法
Nov 01 #Python
详解python Todo清单实战
Nov 01 #Python
在Mac下使用python实现简单的目录树展示方法
Nov 01 #Python
You might like
php 获取远程网页内容的函数
2009/09/08 PHP
php中突破基于HTTP_REFERER的防盗链措施(stream_context_create)
2011/03/29 PHP
php笔记之:初探PHPcms模块开发介绍
2013/04/26 PHP
php中jpgraph类库的使用介绍
2013/08/08 PHP
一个PHP二维数组排序的函数分享
2014/01/17 PHP
php使用simplexml_load_file加载XML文件并显示XML的方法
2015/03/19 PHP
PHP+Jquery与ajax相结合实现下拉淡出瀑布流效果【无需插件】
2016/05/06 PHP
PHP自定义函数实现格式化秒的方法
2016/09/14 PHP
clientX,pageX,offsetX,x,layerX,screenX,offsetLeft区别分析
2010/03/12 Javascript
基于jquery的页面划词搜索JS
2010/09/14 Javascript
改写一个简单的菜单 弹性大小
2010/12/02 Javascript
Jquery提交表单 Form.js官方插件介绍
2012/03/01 Javascript
JS 如何获取radio选中后的值及不选择取radio的值
2013/10/28 Javascript
前端性能优化及技巧
2016/05/06 Javascript
JS实现点击事件统计的简单实例
2016/07/10 Javascript
JavaScript字符串对象(string)基本用法示例
2017/01/18 Javascript
Bootstrap table 定制提示语的加载过程
2017/02/20 Javascript
jquery实现折叠菜单效果【推荐】
2017/03/08 Javascript
基于JS实现移动端左滑删除功能
2017/07/28 Javascript
JS简单添加元素新节点的方法示例
2018/02/10 Javascript
解决Mac node版本升级失败的问题
2018/05/16 Javascript
vue里input根据value改变背景色的实例
2018/09/29 Javascript
详解vue项目中实现图片裁剪功能
2019/06/07 Javascript
js的Object.assign用法示例分析
2020/03/05 Javascript
基于JS实现视频上传显示进度条
2020/05/12 Javascript
vue打包通过image-webpack-loader插件对图片压缩优化操作
2020/11/12 Javascript
Python 字符串中的字符倒转
2008/09/06 Python
Python中的迭代器与生成器高级用法解析
2016/06/28 Python
Python用sndhdr模块识别音频格式详解
2018/01/11 Python
python购物车程序简单代码
2018/04/18 Python
在PyCharm中批量查找及替换的方法
2019/01/20 Python
对python生成业务报表的实例详解
2019/02/03 Python
总结Pyinstaller的坑及终极解决方法(小结)
2020/09/21 Python
Python通过队列来实现进程间通信的示例
2020/10/14 Python
大学生创业计划书常用模板
2019/08/07 职场文书
Java 中的 Lambda List 转 Map 的多种方法详解
2022/07/07 Java/Android