垃圾回收器和“终结”的问题

2024-05-13 23:00:16 发布

您现在位置:Python中文网/ 问答频道 /正文

在因特网上冲浪(here)我发现用__del__方法收集垃圾回收器的对象有一些问题。
我的疑问很简单:为什么?在

根据文件:

Objects that have __del__() methods and are part of a reference cycle cause the entire reference cycle to be uncollectable, including objects not necessarily in the cycle but reachable only from it. Python doesn’t collect such cycles automatically because, in general, it isn’t possible for Python to guess a safe order in which to run the __del__() methods.

为什么__del__方法如此麻烦?实现它的对象和没有实现它的对象有什么区别?它只会销毁一个实例。在


Tags: 文件theto对象方法inobjectshere
1条回答
网友
1楼 · 发布于 2024-05-13 23:00:16

__del__不会销毁实例,一旦引用计数达到零,python运行时会自动销毁它。__del__允许您钩住该进程并执行其他操作,例如释放与对象相关联的外部资源。在

危险在于,附加的操作甚至可能使对象复活,例如,通过将其存储到全局容器中。在这种情况下,销毁被有效地取消(直到下一次对象的引用计数降到零为止)。正是这个场景导致了__del__的存在,从而将对象从循环中断器(也称为垃圾收集器)管理的对象中排除。如果收集器对循环中的所有对象调用了__del__,并且其中一个决定复活该对象,则需要重新启动整个循环—这是不可能的,因为已经调用了其他周期成员的__del__方法,可能会对其对象造成永久性损坏(例如释放外部资源,如上所述)。在

如果只需要通知您对象的销毁,请使用weakref.ref。如果对象与需要释放的外部资源相关联,请实现close方法和/或上下文管理器接口。几乎没有合法的理由使用__del__。在

相关问题 更多 >