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进行稳定可靠的文件操作详解
Dec 31 Python
Python多线程同步Lock、RLock、Semaphore、Event实例
Nov 21 Python
Python使用turtule画五角星的方法
Jul 09 Python
Python验证码识别的方法
Jul 10 Python
python模块之re正则表达式详解
Feb 03 Python
Python实现按特定格式对文件进行读写的方法示例
Nov 30 Python
Python实现将Excel转换成xml的方法示例
Aug 25 Python
Python split() 函数拆分字符串将字符串转化为列的方法
Jul 16 Python
分享8点超级有用的Python编程建议(推荐)
Oct 13 Python
python实现飞机大战游戏(pygame版)
Oct 26 Python
Django中的AutoField字段使用
May 18 Python
asyncio异步编程之Task对象详解
Mar 13 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实现过滤掉非汉字字符只保留中文字符
2015/06/04 PHP
PHP 网站修改默认访问文件的nginx配置
2017/05/27 PHP
PHP简单实现模拟登陆功能示例
2017/09/15 PHP
JavaScript中Array 对象相关的几个方法
2006/12/22 Javascript
禁止F5等快捷键的JS代码
2007/03/06 Javascript
一个简单的弹性返回顶部JS代码实现介绍
2013/06/09 Javascript
使用jquery制作弹出框效果
2015/04/03 Javascript
Angularjs实现分页和分页算法的示例代码
2016/12/23 Javascript
vue+element实现批量删除功能的示例
2018/02/28 Javascript
通过循环优化 JavaScript 程序
2019/06/24 Javascript
微信小程序(订阅消息)功能
2019/10/25 Javascript
vue cli4下环境变量和模式示例详解
2020/04/09 Javascript
利用PHP实现递归删除链表元素的方法示例
2020/10/23 Javascript
jenkins自动构建发布vue项目的方法步骤
2021/01/04 Vue.js
Vue仿Bibibili首页的问题
2021/01/21 Vue.js
Python常用正则表达式符号浅析
2014/08/13 Python
Python中实现常量(Const)功能
2015/01/28 Python
Python自定义scrapy中间模块避免重复采集的方法
2015/04/07 Python
Python实现各种排序算法的代码示例总结
2015/12/11 Python
Python随机生成手机号、数字的方法详解
2017/07/21 Python
使用Python做垃圾分类的原理及实例代码附源码
2019/07/02 Python
pandas对dataFrame中某一个列的数据进行处理的方法
2019/07/08 Python
pandas 缺失值与空值处理的实现方法
2019/10/12 Python
python创建n行m列数组示例
2019/12/02 Python
pyenv虚拟环境管理python多版本和软件库的方法
2019/12/26 Python
TensorFlow2.0:张量的合并与分割实例
2020/01/19 Python
python文件和文件夹复制函数
2020/02/07 Python
Bluebella法国官网:英国性感内衣品牌
2019/05/03 全球购物
小学清明节活动方案
2014/03/08 职场文书
最新优秀教师个人先进事迹材料
2014/05/06 职场文书
学习之星事迹材料
2014/05/17 职场文书
爱耳日宣传活动总结
2014/07/05 职场文书
部队反四风对照检查材料
2014/09/26 职场文书
客户付款通知书
2015/04/23 职场文书
今日说法观后感
2015/06/08 职场文书
CSS link与@import的区别和用法解析
2023/05/07 HTML / CSS