__del__真的是一个析构函数吗?

RaG*_*__M 12 python

我主要在C++中做事,其中析构函数方法实际上是用于破坏获得的资源.最近我开始使用python(这真的很有趣也很棒),我开始学习它像GC一样的GC.因此,没有强调对象所有权(构造和破坏).

据我所知,这个 __init__()方法在python中对我来说比对ruby更有意义,但是__del__()方法,我们真的需要在我们的类中实现这个内置函数吗?如果我想念,我的班级会缺少什么__del__()?我可以看到__del__()有用的一个场景是,如果我想在销毁对象时记录某些内容.除此之外还有什么吗?

Dom*_*Cat 14

Python 3文档中,开发人员现在明确表示析构函数实际上不是该方法的适当名称__del__.

object.__del__(self)

当实例即将被销毁时调用.这也称为终结器或(不正确地)析构函数.

请注意,OLD Python 3文档曾经暗示'析构函数' 正确的名称:

object.__del__(self)

当实例即将被销毁时调用.这也称为析构函数.如果基类具有__del__()方法,则派生类的__del__()方法(如果有)必须显式调用它以确保正确删除实例的基类部分.

其他答案,但也来自维基百科:

在具有自动垃圾收集机制的语言中,很难确定性地确保析构函数的调用,因此这些语言通常被认为不适合RAII [资源获取初始化]

所以你几乎永远不会实现__del__,但是它让你有机会在一些(罕见的)用例中这样做

  • 一个用例是确保关键资源的及时清理前的对象是垃圾回收.即`__del__`检查资源通常是关闭的,如果没有,这样做并发出警告. (3认同)

Flo*_*ker 6

正如其他答案已经指出的那样,您可能不应该__del__在Python中实现.如果你发现自己认为你真的需要一个析构函数(例如,如果你的类包装了一个需要显式关闭的资源),那么Pythonic的方法就是使用上下文管理器.