我有以下课程:
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__'
我在这里想念什么?
[当数据模型文档说object.__whatever__
时,它们并不意味着object
类具有__whatever__
方法。它们的意思是,如果对象具有__whatever__
方法,则其行为应与以下文档描述的相同,并且出于文档描述的原因将隐式调用该对象。
object
本身没有大多数方法。对于__del__
之类的方法,如果您的超类没有该方法,则不要进行super()
调用。
[另外,__del__
不是del
钩子或析构函数-它是终结器,在内存管理系统回收对象之前调用它。使用del
并不意味着必须调用对象的__del__
,并且__del__
不负责释放内存,因此您无需调用知道如何释放对象的某些超类__del__
。
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__
未定义。