我正在编写一个继承自某个库的类。
在上述课程中,我重写了析构函数,以便我可以调用某些以某种方式进行清理的函数。如果我不打电话给 super().__ del __()这是否仍然意味着在破坏课程时清理资源?例如,这段代码是否有可能引入内存泄漏?
class foo(some_library):
...
def __del__(self):
self.proprietary_cleaning_function()
像 __ init __ 或 __ del __ 这样的函数在覆盖它们的方式上有所不同吗?在 __ del __ 之后,python中的垃圾收集机制是否有效?< / p>
答案 0 :(得分:2)
不,您需要显式调用基类析构函数以确保python将完全删除该对象。
如果基类具有
__del__()
方法,则派生类的__del__()
方法,如果有的话,必须明确地调用它以确保正确删除 实例的基类部分。
另请注意,由于__del__()
方法仅在对象引用计数达到零时调用,因此有些常见情况可能会阻止对象的引用计数变为零,包括:
对象之间的循环引用(例如,双向链接列表或 父数据和子指针的树数据结构);参考 捕获异常的函数的堆栈帧上的对象 (存储在
sys.exc_info()
中的回溯保持堆栈帧 活);或者对堆栈框架上引发的对象的引用 交互模式下的未处理异常(存储在其中的回溯)sys.last_traceback
使堆栈帧保持活动状态。第一种情况只能通过明确打破来弥补 循环;第二个可以通过释放引用来解决 追溯对象,当它不再有用时,第三个可以 通过在sys.last_traceback中存储None来解决。循环参考 当循环垃圾时,检测并清理垃圾 收集器已启用(默认情况下已启用)。请参阅文档 有关此主题的更多信息,请参阅gc模块。