gpt4 book ai didi

python - 终结器方法被调用多少次和僵尸(PEP 442)

转载 作者:太空狗 更新时间:2023-10-29 21:58:32 25 4
gpt4 key购买 nike

我对终结器方法 __del__ 产生了疑问。
__del__ 方法在对象被清理之前被调用,但这个方法甚至可以复活对象。现在我注意到在 Python 2.7 中终结器被调用 每次 对象的引用计数器降为零(即使对象已经复活),在 Python3.4 中它被调用只是 一次 对于对象的整个生命周期,因此如果它复活然后计数器降为零,则不再调用终结器方法。

来自PEP 442我在 python 3.4 中读到这个选择是为了防止僵尸复活:

However, if the object was already finalized, then the finalizer isn't called. This prevents us from finalizing zombies

我的疑问是我无法弄清楚这个解决方案是如何阻止我们终结僵尸的,你能给我一些具体的例子吗?此外,该对象只能复活一次。

最佳答案

假设我们有以下类:

class RefCycle:
def __init__(self):
self.refcycle = self
def __del__(self):
print('finalizing')
print(self.refcycle)

然后我们创建并收集一个循环隔离:

RefCycle()
import gc
gc.collect()

当垃圾收集器检测到循环隔离时,它会调用 RefCycle 实例的终结器。然后,它开始中断引用。当它清除 self.refcycle 属性时,对象的引用计数降为 0。

这就是确定的对象不被重新确定很重要的地方。如果那个“已经完成”标志不存在,那么由于引用计数变为 0,对象将被重新完成。由于垃圾收集器已经弄乱了对象的属性,这将是一件非常糟糕的事情。 “已完成”标志保护我们免受这种情况的影响。

关于python - 终结器方法被调用多少次和僵尸(PEP 442),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24735187/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com