Python对象中__del__方法起作用的条件详解

对象的__del__是对象在被gc消除回收的时候起作用的一个方法,它的执行一般也就意味着对象不能够继续引用。

示范代码如下:

1
2
3
4
5
6
7
8
9
class Demo:
 
def __del__(self):
 
  print("calling __del__")
  
obj = Demo()
 
del obj

程序执行结果如下:

1
2
3
grey@DESKTOP-3T80NPQ:/mnt/e/01_workspace/02_programme_language/03_python/03_OOP/2017/08$python del_method.py
 
calling __del__

但是,这并不是让__del__执行的唯一方式。其实,这个方法也可以直接调用。测试代码如下:

1
2
3
4
5
6
7
8
9
class Demo:
 
def __init__(self):
 
  print("calling __del__")
 
obj = Demo()
 
obj.__del__()

程序执行结果:

1
2
3
grey@DESKTOP-3T80NPQ:/mnt/e/01_workspace/02_programme_language/03_python/03_OOP/2017/08$python del_method.py
 
calling __del__

但是,这样的执行很多时候并不能够保证垃圾回收的正常执行。

如下代码:

1
2
3
4
5
grey@DESKTOP-3T80NPQ:/mnt/e/01_workspace/02_programme_language/03_python/03_OOP/2017/08$python del_method.py
 
calling __del__
 
calling __del__

执行结果:

1
2
3
4
5
grey@DESKTOP-3T80NPQ:/mnt/e/01_workspace/02_programme_language/03_python/03_OOP/2017/08$python del_method.py
 
calling __del__
 
calling __del__

推测:上面的删除方法触发了两次删除,但是由于引用关系,删除销毁其实没有实现。

修改代码验证如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Demo:
 
def __del__(self):
 
  print("calling __del__")
 
  del self
 
  
 
obj = Demo()
 
obj.__del__()
 
print(id(obj))

执行结果:

1
2
3
4
5
6
7
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__

从上面看来,其实主要还有对对象的引用,这个销毁的动作还是需要等待对象引用没有了以后才能够完成。进一步验证代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Demo:
 
def __del__(self):
 
  print("calling __del__")
 
  del self
 
  
 
obj = Demo()
 
obj.__del__()
 
print(id(obj))
 
print(id(obj))

执行结果:

1
2
3
4
5
6
7
8
9
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] Python Web开发—进阶提升 490集超强Python视频教程
[Python] 智普教育 python就业班 视频教程 教学视频 百度网盘下载
2017Python运维WEB开发全站工程师系列视频教程
Python实战 四周实现爬虫网站 视频教程 教学视频 百度网盘下载(价值499元)  ...2
Python高级编程技巧实战 基于Python项目与面试题讲解 视频教程 教学视频
Python运维工程师#12期视频系列学习教程
老男孩Python高级全栈开发工程师全套 视频教程 教学视频 百度网盘下载  ...2
老男孩python第六期高级运维开发课程编程实战精品入门进阶完整版 24G
老王Python基础,进阶,项目篇(无KEY完整版) 视频教程 15G
麦子学院招牌课程[明星python编程视频教程][22G](价值9000元)百度网盘下载  ...2
2017python就业班百度云在线分享 attach_img
麦子学院 Python基础+Pythonweb+Python扩展+Python选修四大专题 视频j教程 35G
老男孩python开发视频教程,超级经典,一学就会
2017最新全栈python第2期系列视频教程#92Day attach_img
[Python] Python零基础入门学习视频教程全42集百度云网盘下载
[Python] 老男孩python自动化运维视频教程(全9集)
[Python] Python Web开发 全50集 视频教程 教学视频
[Python] 利用Python SOCKET多线程开发FTP软件 全6集 视频教程 教学视频
[Python] Python.Django 13集 视频教程 教学视频
原文地址:https://www.cnblogs.com/yvonnes/p/10020978.html