Python类析构函数是否保证在程序结束前执行?

Python类析构函数是否保证在程序结束前执行?,python,Python,我们可以强制使用del执行析构函数,通常只让垃圾收集器执行它的工作,但是如果我们在Python中定义一个类析构函数,它保证对每个实例化的对象执行吗?简短回答:否 >答案:< C++ >代码> >代码>并不是C++中的析构函数,你可能不想使用它。 相反,如果需要清理,您可能应该将对象放入上下文管理器(通过编写\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

我们可以强制使用del执行析构函数,通常只让垃圾收集器执行它的工作,但是如果我们在Python中定义一个类析构函数,它保证对每个实例化的对象执行吗?

简短回答:否

<> >答案:< C++ >代码> >代码>并不是C++中的析构函数,你可能不想使用它。 相反,如果需要清理,您可能应该将对象放入上下文管理器(通过编写
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。Python中的大多数类和广泛使用的库都需要释放外部资源(通常是通过调用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
返回
self
\uuuuuuuuuuuuuu

垃圾回收时,通常不需要分配任何代码,如< C++ >代码> >代码> >代码>新代码> >代码>,因为它可以自动收集。


\uuu del\uu
方法有很多用途,但它们很少使用。

没有
当解释器退出时,不能保证为仍然存在的对象调用uu del u()方法。
del
不调用对象的
\uu del uu
方法,它只是减少其引用计数谢谢!这是有道理的。来自C++的我曾经使用RAII类和构造/破坏,这有点不同!不用担心,我不会因为这个原因而依赖于
\uu del\uu
。如果您需要执行一些清理,那么上下文管理器可能是最合适的Python构造函数,使用
del
未必有帮助;如果引发异常,则所有局部变量都会附加到回溯(用于调试工具),因此只要该异常继续存在,就不会收集对象,这可能远远超出了函数的范围。在交互式解释器中,未处理的异常被放置在全局变量中,因此在下次出现未处理的异常之前,它不会被清除。在各种情况下(这被认为是一个实现细节,而不是语言规范的一部分),
\uu del\uu
根本不运行。CPython解释器很少释放内存,即使对象被垃圾收集,这实际上也回答了我的后续问题:)