我看到一些代码在__del__
我发现好奇的对象上被显式调用,所以我尝试使用它来了解它是如何工作的。
我尝试了以下代码(我知道使用__del__
in 本身可能很糟糕,但我只是想在这里启发自己):
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 ofA
已被实例 f 保持活动状态,它也只调用一次Foo
,并且当我将后者设置为 时None
,我没有看到第二次调用析构函数。
这里的Python 文档说:
请注意,该方法可以(尽管不推荐!)
__del__()
通过创建对实例的新引用来推迟实例的销毁。然后可以在稍后删除此新引用时调用它。不能保证__del__()
为解释器退出时仍然存在的对象调用方法。
这似乎意味着该__del__
方法可能会被再次调用,尽管不能保证它会被再次调用。所以我的问题是:在某些情况下__del__
会再次调用吗?(我认为设置f
到None
上面会做到这一点,但它没有)。还有其他值得注意的细微差别吗?