python 文档__del__
解释了当对象的__del__
引用计数减少到零时可以调用对象的方法。它总是立即调用(即同步)吗?或者该__del__
方法是否有可能“在未来的某个时候”被调用?
此外,这个问题的答案是否普遍适用于 Python?或者是否授予语言实现一些自由度?(我使用 CPython。)
对于这个问题,假设如下:
- 有问题的对象继承自
object
. - 有问题的对象具有自定义
__del__
实现。 - 对象的自定义
__del__
实现不会创建对任何对象的新引用。 - 有问题的对象不是引用循环的一部分。
- 解释器未处于关闭过程中。
据我所知,围绕这个话题似乎有很多困惑。为了避免一些不必要的讨论,让我举一些不可接受的答案的例子:
- “不要用
__del__
!很混乱!” - “不要使用
__del__
!它不是'pythonic'。” - “不要使用
__del__
,而是使用上下文管理器。” - 在没有引用可靠来源的情况下断言什么是或不保证的任何答案。(请随意引用其他 SO 答案,但不要依赖它们作为您的唯一来源。在这种情况下,“可信”是指文档中的某些内容,或有信誉的人,甚至可能是 CPython 来源本身。)
用一个例子来解释这个问题,考虑这个代码:
class C(object):
def __init__(self, i):
self.i = i
def __del__(self):
print "C.__del__:", self.i
print "Creating list"
l = [C(0), C(1), C(2)]
print "Popping item 1"
l.pop(1)
print "Clearing list"
l = []
print "Exiting..."
产生以下输出:
$ python test_del.py
Creating list
Popping item 1
C.__del__: 1
Clearing list
C.__del__: 2
C.__del__: 0
Exiting...
请注意,在此示例中,__del__
是同步调用的。这种行为是由语言保证的吗?(请记住上面列出的假设。)