【发布时间】:2013-09-29 01:40:08
【问题描述】:
我看到了一些代码,其中__del__ 被显式调用到一个我觉得很好奇的对象上,所以我尝试使用它来了解它是如何工作的。
我尝试了以下代码(我知道使用 __del__ 本身可能很糟糕,但我只是想在这里启发自己):
class A:
def __init__(self, b):
self.a = 123
self.b = b
print "a is {}".format(self.a)
def __del__(self):
self.a = -1
print "a is {}".format(self.a)
self.b.dont_gc_me = self
def foo(self):
self.a = 9999999
print "a is {}".format(self.a)
class Foo:
def __init__(self):
self.a = 800
def __del__(self):
self.a = 0
然后尝试(在 IPython 控制台中)以下操作:
In [92]: f = Foo()
In [93]: a = A(f)
a is 123
In [94]: a = None
a is -1
In [95]: f.__dict__
Out[95]: {'a': 800, 'dont_gc_me': <__main__.A instance at 0x2456830>}
In [96]: f = None
In [97]:
我看到 __del__ 只被调用一次,即使 A 的实例 a 已被 Foo 的实例 f 保持活动状态,当我将后者设置为 None 时,我没有看到第二次调用析构函数。
请注意,
__del__()是可能的(尽管不推荐!) 通过创建一个新的实例来推迟销毁实例的方法 参考它。然后可以在以后调用这个新的 引用被删除。不保证__del__()方法是 调用解释器退出时仍然存在的对象。
这似乎暗示__del__方法可能会被再次调用,尽管不能保证它会被再次调用。所以我的问题是:在某些情况下__del__ 会再次被调用吗? (我认为将f 设置为None 可以做到这一点,但事实并非如此)。还有其他值得注意的细微差别吗?
【问题讨论】:
标签: python garbage-collection destructor