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实现的可以拷贝或剪切一个文件列表中的所有文件
Apr 30 Python
使用Python写CUDA程序的方法
Mar 27 Python
python中类和实例如何绑定属性与方法示例详解
Aug 18 Python
python 递归遍历文件夹,并打印满足条件的文件路径实例
Aug 30 Python
Python数据分析之双色球统计两个红和蓝球哪组合比例高的方法
Feb 03 Python
Python基于SMTP协议实现发送邮件功能详解
Aug 14 Python
python对视频画框标记后保存的方法
Dec 07 Python
python重要函数eval多种用法解析
Jan 14 Python
python Shapely使用指南详解
Feb 18 Python
浅谈图像处理中掩膜(mask)的意义
Feb 19 Python
Python request中文乱码问题解决方案
Sep 17 Python
python 发送邮件的示例代码(Python2/3都可以直接使用)
Dec 03 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自定义大小验证码的方法详解
2013/06/07 PHP
ThinkPHP实例化模型的四种方法概述
2014/08/22 PHP
jQuery中获取checkbox选中项等操作及注意事项
2013/11/24 Javascript
利用Jquery实现可多选的下拉框
2014/02/21 Javascript
JS仿Windows开机启动Loading进度条的方法
2015/02/26 Javascript
Jquery实现仿京东商城省市联动菜单
2015/11/19 Javascript
微信小程序 122100版本更新问题解决方案
2016/12/22 Javascript
解决Vue不能检测数组或对象变动的问题
2018/02/24 Javascript
js提取中文拼音首字母的封装工具类
2018/03/12 Javascript
详解如何用webpack4从零开始构建react开发环境
2019/01/27 Javascript
[15:56]Heroes18_暗影萨满(完美)
2014/10/31 DOTA
python根据给定文件返回文件名和扩展名的方法
2015/03/27 Python
以911新闻为例演示Python实现数据可视化的教程
2015/04/23 Python
Python设置默认编码为utf8的方法
2016/07/01 Python
Django接受前端数据的几种方法总结
2016/11/04 Python
python中利用xml.dom模块解析xml的方法教程
2017/05/24 Python
使用Python监视指定目录下文件变更的方法
2018/10/15 Python
Python实现常见的回文字符串算法
2018/11/14 Python
Pandas分组与排序的实现
2019/07/23 Python
Python 脚本实现淘宝准点秒杀功能
2019/11/13 Python
python3 使用traceback定位异常实例
2020/03/09 Python
Python定时任务APScheduler原理及实例解析
2020/05/30 Python
Pytho爬虫中Requests设置请求头Headers的方法
2020/09/22 Python
python 批量下载bilibili视频的gui程序
2020/11/20 Python
CSS3 :nth-child()伪类选择器实现奇偶行显示不同样式
2013/11/05 HTML / CSS
JAVA中的关键字有什么特点
2014/03/07 面试题
外贸业务员岗位职责
2013/11/24 职场文书
毕业生自荐信
2013/12/14 职场文书
大学生职业规划前言模板
2013/12/27 职场文书
2014年机关党委工作总结
2014/12/11 职场文书
个人求职意向书
2015/05/11 职场文书
刑事起诉书范文
2015/05/19 职场文书
2015年会计年终工作总结
2015/05/26 职场文书
2016年植树节红领巾广播稿
2015/12/17 职场文书
《海上日出》教学反思
2016/02/23 职场文书
springboot @ConfigurationProperties和@PropertySource的区别
2021/06/11 Java/Android