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 相关文章推荐
tornado框架blog模块分析与使用
Nov 21 Python
python脚本内运行linux命令的方法
Jul 02 Python
Python 的内置字符串方法小结
Mar 15 Python
pytorch 转换矩阵的维数位置方法
Dec 08 Python
Pycharm新手教程(只需要看这篇就够了)
Jun 18 Python
Django时区详解
Jul 24 Python
python使用sessions模拟登录淘宝的方式
Aug 16 Python
Python3.6 + TensorFlow 安装配置图文教程(Windows 64 bit)
Feb 24 Python
python+adb+monkey实现Rom稳定性测试详解
Apr 23 Python
PyCharm2020.1.1与Python3.7.7的安装教程图文详解
Aug 07 Python
pycharm-professional-2020.1下载与激活的教程
Sep 21 Python
python 使用paramiko模块进行封装,远程操作linux主机的示例代码
Dec 03 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
?生?D片??C字串
2006/12/06 PHP
php遍历目录viewDir函数
2009/12/15 PHP
php数组对百万数据进行排除重复数据的实现代码
2010/06/08 PHP
php二维数组排序与默认自然排序的方法介绍
2013/04/27 PHP
PHP中提问频率最高的11个面试题和答案
2014/09/02 PHP
php一行代码获取文件后缀名实例分析
2014/11/12 PHP
PHP构造函数与析构函数用法示例
2016/09/28 PHP
PHP正则之正向预查与反向预查讲解与实例
2020/04/06 PHP
jQuery TextBox自动完成条
2009/07/22 Javascript
javascript call方法使用说明
2010/01/11 Javascript
dess中一个简单的多路委托的实现
2010/07/20 Javascript
Jquery post传递数组方法实现思路及代码
2013/04/28 Javascript
JS模式之单例模式基本用法
2015/06/30 Javascript
js中数组的常用方法小结
2016/12/30 Javascript
nodejs接入阿里大鱼短信验证码的方法
2017/07/10 NodeJs
vue使用mint-ui实现下拉刷新和无限滚动的示例代码
2017/11/06 Javascript
基于vue实现一个禅道主页拖拽效果
2019/05/27 Javascript
解决vue中使用proxy配置不同端口和ip接口问题
2019/08/14 Javascript
vue实现弹幕功能
2019/10/25 Javascript
解决vue项目中出现Invalid Host header的问题
2020/11/17 Javascript
深入浅析Python字符编码
2015/11/12 Python
Python常用内置模块之xml模块(详解)
2017/05/23 Python
Python基于Logistic回归建模计算某银行在降低贷款拖欠率的数据示例
2019/01/23 Python
python 调用钉钉机器人的方法
2019/02/20 Python
Python占用的内存优化教程
2019/07/28 Python
用Python解数独的方法示例
2019/10/24 Python
python opencv肤色检测的实现示例
2020/12/21 Python
shallow copy和deep copy的区别
2016/05/09 面试题
编写一个类体现构造,公有,私有方法,静态,私有变量
2013/08/10 面试题
用C#语言写出在本地创建一个UDP接收端口的具体过程
2016/02/22 面试题
计算机应用毕业生自荐信
2013/10/23 职场文书
应届大学生求职信
2013/12/01 职场文书
公司活动策划方案
2014/01/13 职场文书
想创业成功,需要掌握这些要点
2019/12/06 职场文书
详解CocosCreator项目结构机制
2021/04/14 Javascript
Python实现聚类K-means算法详解
2022/07/15 Python