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

时间:2016-06-16 07:27:12

标签: python

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

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

4 个答案:

答案 0 :(得分:14)

Python 3 docs中,开发人员现已明确指出析构函数实际上不是方法__del__的适当名称。

  

object.__del__(self)

     

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

请注意, OLD Python 3文档用于表示'析构函数'正确的名称:

  

object.__del__(self)

     

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

来自other answers,也来自Wikipedia

  

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

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

答案 1 :(得分:6)

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

答案 2 :(得分:2)

  

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

不,__del__方法不是析构函数,只是您想要执行任何操作时可以调用的常规方法,但它总是在垃圾收集器销毁对象之前调用。 可以把它想象成干净或最后的方法。

答案 3 :(得分:0)

这是不常见的是我今天已经了解它(而且我很久以前就已经进入了python)。

GC已释放内存,文件已关闭......但是你可能需要在课堂外执行一些任务。

我的用例是关于某些时间目录实现某种RAII。无论如何,我都希望将其删除。

我没有在处理之后删除它(在经过一些更改之后不再运行),而是将其移动到__del__方法,并且按预期工作。

这是一个非常具体的案例,我们并不关心何时调用该方法,只要在离开程序之前调用该方法即可。所以,要小心使用。