Python文档中
此外,这个问题的答案适用于Python吗?还是语言实现允许一些余地?(我使用CPython。)
对于这个问题,请假设以下内容:
- 有关对象继承自
据我所知,这个话题似乎存在很多混淆。为了避免一些不必要的讨论,让我举几个不可接受的答案示例:
注意,在这个例子中,
__del__
的解释说明当对象的引用计数降为零时,可以调用其__del__
方法。它是否总是立即调用(即同步)?或者__del__
方法可能在“将来的某个时间点”被调用?此外,这个问题的答案适用于Python吗?还是语言实现允许一些余地?(我使用CPython。)
对于这个问题,请假设以下内容:
- 有关对象继承自
object
。
- 有关对象具有自定义的__del__
实现。
- 有关对象的自定义__del__
实现不会创建对任何对象的新引用。
- 有关对象不是引用循环的一部分。
- 解释器没有关闭的过程。据我所知,这个话题似乎存在很多混淆。为了避免一些不必要的讨论,让我举几个不可接受的答案示例:
- 不要使用
__del__
!这会让人感到困惑! - 不要使用
__del__
!这不符合Python的风格。 - 不要使用
__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__
是同步调用的。这种行为是否由语言保证?(请记住上面列出的假设。)