我发现自定义的__del__ 方法在涉及到循环引用时似乎不会执行。
这是一个示例代码:
class DelClass():
def __init__(self,a):
self.prop = a
def __del__(self):
print 'del'
if __name__ == "__main__":
dc1 = DelClass(None)
dc2 = DelClass(dc1)#dc2 referring to dc1
dc1.prop = dc2#dc1 referring to dc2, thus creating circular reference
del dc1#not executing the custom __del__ method
dc = DelClass(1)
del dc#executing the custom __del__ method
为什么会这样?
编辑: 感谢布伦巴恩。我找到了原因。
del something 只会将 something 的引用计数减 1。
__del__ 只会在引用计数达到 0 时执行。
这是一个测试代码:
import gc
class DelClass():
def __init__(self,name,a):
self.name = name
self.prop = a
def __del__(self):
print '#####deleting',self.name
dc1 = DelClass("dc1",None)
dc2 = DelClass("dc2",dc1)#dc2 referring to dc1
dc1.prop = dc2#dc1 referring to dc2, thus creating circular reference
print "before deleting dc1,reference count:",len(gc.get_referrers(dc1))
del dc1#not executing the custom __del__ method
print "after deleting dc1, reference count:",len(gc.get_referrers(dc2.prop))
print "deleting the reference held by dc2"
del dc2.prop
print dc2
输出是:
before deleting dc1,reference count: 2
after deleting dc1, reference count: 1
deleting the reference held by dc2
#####deleting dc1
<__main__.DelClass instance at 0x9316dec>
#####deleting dc2
又出现了一个问题:
为什么会出现输出中的最后一行(#####deleting dc2)?
某些隐式 del 操作发生了吗?
请您参考如下方法:
阅读documentation for __del__和 for the garbage collector . __del__ 并不像您认为的那样,del 也不行。 __del__ 在执行 del 时不一定会被调用,并且在循环引用的情况下可能永远不会被调用。 del 所做的只是将引用计数减 1。
