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 28 Python
Python初学时购物车程序练习实例(推荐)
Aug 08 Python
Python使用回溯法子集树模板解决爬楼梯问题示例
Sep 08 Python
Python实现定时执行任务的三种方式简单示例
Mar 30 Python
总结Python图形用户界面和游戏开发知识点
May 22 Python
Django中使用极验Geetest滑动验证码过程解析
Jul 31 Python
Python安装OpenCV的示例代码
Mar 05 Python
pyautogui自动化控制鼠标和键盘操作的步骤
Apr 01 Python
Python如何将将模块分割成多个文件
Aug 04 Python
python进度条显示-tqmd模块的实现示例
Aug 23 Python
python识别验证码的思路及解决方案
Sep 13 Python
如何使用pycharm连接Databricks的步骤详解
Sep 23 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 is_subclass_of函数的一个BUG和解决方法
2014/06/01 PHP
PHP编程中的常见漏洞和代码实例
2014/08/06 PHP
CI框架验证码CAPTCHA辅助函数用法实例
2014/11/05 PHP
php使用PDO下exec()函数查询执行后受影响行数的方法
2017/03/28 PHP
event对象的方法 兼容多浏览器
2009/06/27 Javascript
JavaScript下通过的XMLHttpRequest发送请求的代码
2011/06/28 Javascript
Jquery 的outerHeight方法使用介绍
2013/09/11 Javascript
JS组件Bootstrap导航条使用方法详解
2016/04/29 Javascript
Bootstrap组件系列之福利篇几款好用的组件(推荐二)
2016/07/12 Javascript
JavaScript学习笔记整理_关于表达式和语句
2016/09/19 Javascript
微信小程序教程之本地图片上传(leancloud)实例详解
2016/11/16 Javascript
JavaScript实现自定义媒体播放器方法介绍
2017/01/03 Javascript
利用vue + koa2 + mockjs模拟数据的方法教程
2017/11/22 Javascript
基于vue监听滚动事件实现锚点链接平滑滚动的方法
2018/01/17 Javascript
JavaScript实现京东购物放大镜和选项卡效果的方法分析
2018/07/05 Javascript
Vue开发实现吸顶效果的示例代码
2018/08/21 Javascript
vue3弹出层V3Popup实例详解
2021/01/04 Vue.js
Python实现读取并保存文件的类
2017/05/11 Python
python logging日志模块以及多进程日志详解
2018/04/18 Python
Python设计模式之外观模式实例详解
2019/01/17 Python
超简单使用Python换脸实例
2019/03/27 Python
pyqt5移动鼠标显示坐标的方法
2019/06/21 Python
Python 把序列转换为元组的函数tuple方法
2019/06/27 Python
python 的 scapy库,实现网卡收发包的例子
2019/07/23 Python
python 非线性规划方式(scipy.optimize.minimize)
2020/02/11 Python
Python CategoricalDtype自定义排序实现原理解析
2020/09/11 Python
CSS实现圆形放大镜狙击镜效果 只有圆圈里的放大
2012/12/10 HTML / CSS
StubHub德国:购买和出售门票
2017/09/06 全球购物
戴森西班牙官网:Dyson西班牙
2020/02/04 全球购物
教师应聘个人求职信
2013/12/10 职场文书
大学生实习鉴定评语
2014/04/25 职场文书
工作犯错保证书
2015/05/11 职场文书
go mod 安装依赖 unkown revision问题的解决方案
2021/05/06 Golang
利用Python实现Picgo图床工具
2021/11/23 Python
CSS font-variation 可变字体的魅力(实例详解)
2022/03/03 HTML / CSS
CSS子盒子水平和垂直居中的五种方法
2022/07/23 HTML / CSS