自定义__del__不存在?

问题描述 投票:1回答:2

我有以下课程:

class Item:
    def __init__(self, type='new'):
        self.type=type
    def __del__(self):
        print ('Deleted')
        super().__del__()

>>> i=Item()
>>> del i

AttributeError:'super'对象没有属性'del'

如果使用自定义删除方法,如何正确删除该对象?

docs表示每个对象都存在一个__new____init____del__,但在python 3.6中进行测试时,我只看到两个:

>>> object.__new__
<built-in method __new__ of type object at 0x100922700>
>>> object.__init__
<slot wrapper '__init__' of 'object' objects>
>>> object.__del__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: type object 'object' has no attribute '__del__'

我在这里想念什么?

python python-3.x
2个回答
7
投票

[当数据模型文档说object.__whatever__时,它们并不意味着object类具有__whatever__方法。它们的意思是,如果对象具有__whatever__方法,则其行为应与以下文档描述的相同,并且出于文档描述的原因将隐式调用该对象。

object本身没有大多数方法。对于__del__之类的方法,如果您的超类没有该方法,则不要进行super()调用。

[另外,__del__不是del钩子或析构函数-它是终结器,在内存管理系统回收对象之前调用它。使用del并不意味着必须调用对象的__del__,并且__del__不负责释放内存,因此您无需调用知道如何释放对象的某些超类__del__


1
投票

TL; DR不要调用super().__del__(),您的实例将删除就可以了。提供了覆盖__del__以执行清除。

Item继承自object。如果您打开Python3控制台

>>> dir(object())
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

__del__未定义。

© www.soinside.com 2019 - 2024. All rights reserved.