重写析构函数时不调用其父类的析构函数

3

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

在这个类中,我重写了析构函数,以便可以调用某些以特定方式进行清理的函数。如果我不调用 super().__del__(),是否仍然意味着在销毁类时会清理资源?例如,这段代码是否存在内存泄漏的可能性?

class foo(some_library):
    ...

    def __del__(self):
        self.proprietary_cleaning_function()

__init__ 或者 __del__ 这样的函数,在重写时是否有所不同?Python中的垃圾回收机制是否在执行 __del__ 后工作?

1个回答

3
不,您需要显式调用基类的析构函数,以确保Python完全删除对象。
来自文档
如果基类有一个__del__()方法,则派生类的__del__()方法(如果有)必须显式调用它,以确保正确删除实例的基类部分。
此外,请注意,由于__del__()方法仅在对象引用计数达到零时才被调用,因此可能会出现一些常见情况,防止对象的引用计数降为零,其中包括:
对象之间的循环引用(例如,具有父指针和子指针的树数据结构或双向链表);对于在函数堆栈框架上捕获异常的对象的引用(存储在sys.exc_info()中的回溯会保留堆栈框架);或者对于在交互模式下引发未处理异常的堆栈帧上的对象的引用(存储在sys.last_traceback中的回溯将保留该堆栈帧)。第一种情况只能通过显式打破循环来解决;第二种情况可以通过在不再需要时释放对回溯对象的引用来解决,第三种情况可以通过在sys.last_traceback中存储None来解决。当启用循环垃圾收集器时(默认情况下启用),会检测和清除垃圾的循环引用。有关此主题的更多信息,请参阅gc模块的文档。

当父类中没有实现 __del__ 方法时,覆盖对象的 del 是否也是同样的情况? - GLaDOS
@GLaDOS 当父类没有__del__方法时,不需要调用。但是如果它内置了该方法,仍然需要显式调用。 - Mazdak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接