我主要在C ++中做事,其中析构函数方法实际上是用于破坏获得的资源。最近我开始使用python(这真的很有趣也很棒),我开始学习它像GC一样的GC。 因此,没有过分强调对象所有权(构造和破坏)。
据我所知,__init__()
方法在python中比对ruby更有意义,但是__del__()
方法,我们真的需要实现这个吗我们班的内置功能?如果我错过__del__()
,我的班级会缺少什么吗?我可以看到__del__()
有用的一个场景是,如果我想在销毁对象时记录某些内容。除此之外还有什么吗?
答案 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__
方法,并且按预期工作。
这是一个非常具体的案例,我们并不关心何时调用该方法,只要在离开程序之前调用该方法即可。所以,要小心使用。