Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 重写析构函数而不调用其父级_Python_Python 3.x_Garbage Collection - Fatal编程技术网

Python 重写析构函数而不调用其父级

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

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

在上述类中,我重写析构函数,以便调用以某种方式进行清理的函数。如果我不调用super()。\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
方法时。但是如果它有内置的方法,您仍然需要显式地调用它。