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批量生成本地ip地址的方法
Mar 23 Python
使用Python求解最大公约数的实现方法
Aug 20 Python
在Python的Flask框架中验证注册用户的Email的方法
Sep 02 Python
python中OrderedDict的使用方法详解
May 05 Python
Python实现的计数排序算法示例
Nov 29 Python
PyQt5 pyqt多线程操作入门
May 05 Python
在python tkinter中Canvas实现进度条显示的方法
Jun 14 Python
基于django传递数据到后端的例子
Aug 16 Python
FFrpc python客户端lib使用解析
Aug 24 Python
Python读取YAML文件过程详解
Dec 30 Python
Python字典添加,删除,查询等相关操作方法详解
Feb 07 Python
python图形开发GUI库wxpython使用方法详解
Feb 14 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
PHP5中GD库生成图形验证码(有汉字)
2013/07/28 PHP
浅谈php和.net的区别
2014/09/28 PHP
一个非常实用的php文件上传类
2017/07/04 PHP
Prototype 1.5.0_rc1 及 Prototype 1.5.0 Pre0小抄本
2006/09/22 Javascript
javascript 面向对象 function类
2010/05/13 Javascript
jQuery UI Dialog 创建友好的弹出对话框实现代码
2012/04/12 Javascript
JS动态获取当前时间,并写到特定的区域
2013/05/03 Javascript
浅谈setTimeout 与 setInterval
2015/06/23 Javascript
javascript框架设计之框架分类及主要功能
2015/06/23 Javascript
详解Document.Cookie
2015/12/25 Javascript
JS JSOP跨域请求实例详解
2016/07/04 Javascript
详解JavaScript中数组的reduce方法
2016/12/02 Javascript
JS新包管理工具yarn和npm的对比与使用入门
2016/12/09 Javascript
使用jquery给新生的th绑定hover事件的实例
2017/02/10 Javascript
vue登录路由验证的实现
2017/12/13 Javascript
vue axios基于常见业务场景的二次封装的实现
2018/09/21 Javascript
jQuery单页面文字搜索插件jquery.fullsearch.js的使用方法
2020/02/04 jQuery
vue中解决微信html5原生ios虚拟键返回不刷新问题
2020/10/20 Javascript
详解Django中的权限和组以及消息
2015/07/23 Python
Python的面向对象编程方式学习笔记
2016/07/12 Python
使用python将图片格式转换为ico格式的示例
2018/10/22 Python
Pytorch加载部分预训练模型的参数实例
2019/08/18 Python
用opencv给图片换背景色的示例代码
2020/07/08 Python
python判断元素是否存在的实例方法
2020/09/24 Python
德国户外装备、登山运动和攀岩商店:tapir store
2020/02/12 全球购物
双十佳事迹材料
2014/01/29 职场文书
个性与发展自我评价
2014/02/11 职场文书
《中彩那天》教学反思
2014/02/22 职场文书
春节晚会主持词
2014/03/24 职场文书
大学生通用个人自我评价
2014/04/27 职场文书
荆州古城导游词
2015/02/06 职场文书
党支部鉴定意见
2015/06/02 职场文书
python实战之用emoji表情生成文字
2021/05/08 Python
Redis监控工具RedisInsight安装与使用
2022/03/21 Redis
JavaScript声明变量和数据类型的转换
2022/04/12 Javascript
JS前端轻量fabric.js系列物体基类
2022/08/05 Javascript