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求列表交集的方法汇总
Nov 10 Python
python3爬虫之设计签名小程序
Jun 19 Python
python多进程实现文件下载传输功能
Jul 28 Python
Python图像处理之直线和曲线的拟合与绘制【curve_fit()应用】
Dec 26 Python
pyqt 实现在Widgets中显示图片和文字的方法
Jun 13 Python
python 实现12bit灰度图像映射到8bit显示的方法
Jul 08 Python
Django框架视图函数设计示例
Jul 29 Python
Python 多线程其他属性以及继承Thread类详解
Aug 28 Python
详解python中index()、find()方法
Aug 29 Python
在python3中使用shuffle函数要注意的地方
Feb 28 Python
Python Socket TCP双端聊天功能实现过程详解
Jun 15 Python
10个示例带你掌握python中的元组
Nov 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
微信公众平台网页授权获取用户基本信息中授权回调域名设置的变动
2014/10/21 PHP
php计算两个日期相差天数的方法
2015/03/14 PHP
PHP生成唯一订单号
2015/07/05 PHP
简单介绍PHP的责任链编程模式
2015/08/11 PHP
PHP编程实现微信企业向用户付款的方法示例
2017/07/26 PHP
ThinkPHP实现转换数据库查询结果数据到对应类型的方法
2017/11/16 PHP
PHP单例模式应用示例【多次连接数据库只实例化一次】
2018/12/18 PHP
PHP实现会员账号单唯一登录的方法分析
2019/03/07 PHP
破除网页鼠标右键被禁用的绝招大全
2006/12/27 Javascript
JQuery 实现的页面滚动时浮动窗口控件
2009/07/10 Javascript
js实现连续英文字符自动换行兼容ie6 ie7和firefox
2013/09/06 Javascript
如何学习Javascript入门指导
2013/11/01 Javascript
Javascript中innerHTML用法实例分析
2015/01/12 Javascript
Window.Open打开窗体和if嵌套代码
2016/04/15 Javascript
JavaScript必知必会(三) String .的方法来自何方
2016/06/08 Javascript
JS正则验证多个邮箱完整实例【邮箱用分号隔开】
2017/04/19 Javascript
jquery.guide.js新版上线操作向导镂空提示jQuery插件(推荐)
2017/05/20 jQuery
NodeJS爬虫实例之糗事百科
2017/12/14 NodeJs
vue2.0 自定义 饼状图 (Echarts)组件的方法
2018/03/02 Javascript
vue实现element-ui对话框可拖拽功能
2018/08/17 Javascript
提升node.js中使用redis的性能遇到的问题及解决方法
2018/10/30 Javascript
Javascript实现秒表倒计时功能
2018/11/17 Javascript
微信小程序与后台PHP交互的方法实例分析
2018/12/10 Javascript
Vue框架TypeScript装饰器使用指南小结
2019/02/18 Javascript
layui使用button按钮 点击出现弹层 弹层中加载表单的实例
2019/09/04 Javascript
python使用PythonMagick将jpg图片转换成ico图片的方法
2015/03/26 Python
简洁的十分钟Python入门教程
2015/04/03 Python
Django ForeignKey与数据库的FOREIGN KEY约束详解
2020/05/20 Python
加拿大最大的相机店:Henry’s
2017/05/17 全球购物
员工入职担保书范文
2014/04/01 职场文书
业务员自荐信范文
2014/04/20 职场文书
教师求职自荐书
2014/06/14 职场文书
简单租房协议书(范本)
2014/10/13 职场文书
总经理岗位职责
2015/02/04 职场文书
美容院管理规章制度
2015/08/05 职场文书
七年级作文之环保作文
2019/10/17 职场文书