__del__
的Python文档解释了当对象的引用计数减为零时,可以调用对象的__del__
方法。它是否总是立即被调用(即同步)?或者有可能将这种方法称为“将来的某个时刻”?python是否总是同时调用__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__
是同步呼叫。这种行为是否由语言保证? (请记住上面列出的假设。)
你的用例答案很重要? –
如果我可以依靠这种行为,它允许一个更清洁的API设计。我没有强迫我的图书馆的用户记得在我给它们的对象上调用一些特殊的“cleanUp()”函数,我只需将必要的清理代码放在__del__中即可。例如,这是C++中良好的基于RAII的API设计的基础。 –
但是,当* __del__被调用时,知道如何改变? (在任何情况下,该对象都将被删除*) –