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基础教程之popen函数操作其它程序的输入和输出示例
Feb 10 Python
详解Python中的正则表达式的用法
Apr 09 Python
初步解析Python下的多进程编程
Apr 28 Python
Python中基础的socket编程实战攻略
Jun 01 Python
Flask框架的学习指南之制作简单blog系统
Nov 20 Python
Python多线程经典问题之乘客做公交车算法实例
Mar 22 Python
对numpy中布尔型数组的处理方法详解
Apr 17 Python
python MNIST手写识别数据调用API的方法
Aug 08 Python
python3.6 如何将list存入txt后再读出list的方法
Jul 02 Python
python标记语句块使用方法总结
Aug 05 Python
tensorflow实现对张量数据的切片操作方式
Jan 19 Python
整理Python中常用的conda命令操作
Jun 15 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之第二天
2006/10/09 PHP
支持中文的php加密解密类代码
2011/11/27 PHP
Uncaught exception com_exception with message Failed to create COM object
2012/01/11 PHP
php实现多张图片上传加水印技巧
2013/04/18 PHP
解析php中memcache的应用
2013/06/18 PHP
使用php计算排列组合的方法
2013/11/13 PHP
Yii redis集合的基本使用教程
2020/06/14 PHP
Js四则运算函数代码
2012/07/21 Javascript
Jjcarousellite 实现图片列表滚动的简单实例
2013/11/29 Javascript
js设置function参数默认值(适合没有传参情况)
2014/02/24 Javascript
JavaScript 事件绑定及深入
2015/04/13 Javascript
AngularJS中如何使用$parse或$eval在运行时对Scope变量赋值
2016/01/25 Javascript
Jquery为DIV添加click事件的简单实例
2016/06/02 Javascript
AngularJS压缩JS技巧分析
2016/11/08 Javascript
DropDownList实现可输入可选择(两种版本可选)
2016/12/07 Javascript
手机端js和html5刮刮卡效果
2020/09/29 Javascript
Bootstrap select下拉联动(jQuery cxselect)
2017/01/04 Javascript
node.js 抓取代理ip实例代码
2017/04/30 Javascript
vue v-model动态生成详解
2018/06/30 Javascript
JS Object.preventExtensions(),Object.seal()与Object.freeze()用法实例分析
2018/08/25 Javascript
原生JS实现旋转轮播图+文字内容切换效果【附源码】
2018/09/29 Javascript
vue组件从开发到发布的实现步骤
2018/11/11 Javascript
js取小数点后两位四种方法
2019/01/18 Javascript
详解javascript 变量提升(Hoisting)
2019/03/12 Javascript
儿童学习python的一些小技巧
2018/05/27 Python
快速解决docker-py api版本不兼容的问题
2019/08/30 Python
Python第三方包PrettyTable安装及用法解析
2020/07/08 Python
Django中的DateTimeField和DateField实现
2021/02/24 Python
CSS3 3D酷炫立方体变换动画的实现
2019/03/26 HTML / CSS
通用求职信范文模板分享
2013/12/27 职场文书
清扬洗发水广告词
2014/03/14 职场文书
公务员个人年终总结
2015/02/12 职场文书
个人原因辞职信模板
2015/05/13 职场文书
护理培训心得体会
2016/01/22 职场文书
PyCharm 安装与使用配置教程(windows,mac通用)
2021/05/12 Python
刚学完怎么用Python实现定时任务,转头就跑去撩妹!
2021/06/05 Python