在没有打电话给父母的情况下覆盖析构函数

时间:2017-01-29 10:06:13

标签: python python-3.x garbage-collection

我正在编写一个继承自某个库的类。

在上述课程中,我重写了析构函数,以便我可以调用某些以某种方式进行清理的函数。如果我不打电话给 super().__ del __()这是否仍然意味着在破坏课程时清理资源?例如,这段代码是否有可能引入内存泄漏?

class foo(some_library):
    ...

    def __del__(self):
        self.proprietary_cleaning_function()

__ init __ __ del __ 这样的函数在覆盖它们的方式上有所不同吗?在 __ del __ 之后,python中的垃圾收集机制是否有效?< / p>

1 个答案:

答案 0 :(得分:2)

不,您需要显式调用基类析构函数以确保python将完全删除该对象。

来自documentation

  

如果基类具有__del__()方法,则派生类的__del__()   方法,如果有的话,必须明确地调用它以确保正确删除   实例的基类部分。

另请注意,由于__del__()方法仅在对象引用计数达到零时调用,因此有些常见情况可能会阻止对象的引用计数变为零,包括:

  

对象之间的循环引用(例如,双向链接列表或   父数据和子指针的树数据结构);参考   捕获异常的函数的堆栈帧上的对象   (存储在sys.exc_info()中的回溯保持堆栈帧   活);或者对堆栈框架上引发的对象的引用   交互模式下的未处理异常(存储在其中的回溯)   sys.last_traceback使堆栈帧保持活动状态。

     

第一种情况只能通过明确打破来弥补   循环;第二个可以通过释放引用来解决   追溯对象,当它不再有用时,第三个可以   通过在sys.last_traceback中存储None来解决。循环参考   当循环垃圾时,检测并清理垃圾   收集器已启用(默认情况下已启用)。请参阅文档   有关此主题的更多信息,请参阅gc模块。