在因特网上冲浪(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__
方法如此麻烦?实现它的对象和没有实现它的对象有什么区别?它只会销毁一个实例。在
__del__
不会销毁实例,一旦引用计数达到零,python运行时会自动销毁它。__del__
允许您钩住该进程并执行其他操作,例如释放与对象相关联的外部资源。在危险在于,附加的操作甚至可能使对象复活,例如,通过将其存储到全局容器中。在这种情况下,销毁被有效地取消(直到下一次对象的引用计数降到零为止)。正是这个场景导致了
__del__
的存在,从而将对象从循环中断器(也称为垃圾收集器)管理的对象中排除。如果收集器对循环中的所有对象调用了__del__
,并且其中一个决定复活该对象,则需要重新启动整个循环—这是不可能的,因为已经调用了其他周期成员的__del__
方法,可能会对其对象造成永久性损坏(例如释放外部资源,如上所述)。在如果只需要通知您对象的销毁,请使用
weakref.ref
。如果对象与需要释放的外部资源相关联,请实现close
方法和/或上下文管理器接口。几乎没有合法的理由使用__del__
。在相关问题 更多 >
编程相关推荐