Python 重写析构函数而不调用其父级
我正在编写一个从某个库继承的类 在上述类中,我重写析构函数,以便调用以某种方式进行清理的函数。如果我不调用super()。\uuuu del\uuuu(),这是否仍然意味着在销毁类时清理资源?例如,这段代码是否有可能导致内存泄漏Python 重写析构函数而不调用其父级,python,python-3.x,garbage-collection,Python,Python 3.x,Garbage Collection,我正在编写一个从某个库继承的类 在上述类中,我重写析构函数,以便调用以某种方式进行清理的函数。如果我不调用super()。\uuuu del\uuuu(),这是否仍然意味着在销毁类时清理资源?例如,这段代码是否有可能导致内存泄漏 class foo(some_library): ... def __del__(self): self.proprietary_cleaning_function() 像uuu init uuuuuuuu或uuuu del uuuu
class foo(some_library):
...
def __del__(self):
self.proprietary_cleaning_function()
像uuu init uuuuuuuu或uuuu del uuuuuu这样的函数在重写方式上是否不同?python中的垃圾收集机制在uu del uuuuuuuu之后是否工作?否,您需要显式调用基类析构函数,以确保python将完全删除该对象 发件人: 如果基类有一个
\uu del\uu()
方法,则派生类的\uu del\uu()
方法(如果有)必须显式调用它以确保正确删除
实例的基类部分
还请注意,由于只有当对象引用计数达到零时才会调用\uuu del\uuu()
方法,因此有一些常见情况可能会阻止对象的引用计数变为零,包括:
对象之间的循环引用(例如,双链接列表或
具有父指针和子指针的树数据结构);提及
捕获异常的函数堆栈帧上的对象
(存储在sys.exc_info()
中的回溯保留堆栈帧
活的);或对堆栈帧上引发错误的对象的引用
交互模式下未处理的异常(回溯存储在
sys.last\u traceback
使堆栈帧保持活动状态)
第一种情况只能通过明确打破
周期;第二个问题可以通过释放对
当回溯对象不再有用时,可以使用第三个对象
通过在sys.last_回溯中存储None来解决。循环引用
当循环垃圾发生时,哪些是垃圾被检测并清除
收集器已启用(默认情况下处于打开状态)。请参阅文档
有关此主题的更多信息,请参阅gc模块
当父类中没有实现_del__方法时,情况也是这样吗?i、 e重写对象del?@GLaDOS否,当父类没有
\uuu del\uuu
方法时。但是如果它有内置的方法,您仍然需要显式地调用它。