del是删除一个对象,其实准确的说,应该是使该对象的引用计数减一。但是注意,并不是每次调用它的时候,del()就会调用,因为__del__()是在该对象的引用计数降为0时才会被调用,示例为证:
>>> class C:
def __del__(self):
print("I'm vanishing...")
>>> c = C()
>>> b = c # 注意,此时对C()的引用计数为2
>>> del b
>>> # 瞧,什么输出都没有,说明__del__()并没调用
>>> del c
I'm vanishing... # 引用计数降为0后才被调用
>>>
接下来理解这一点:
创建对象后,python解释器默认调用__init__()方法。当删除一个对象时,python解释器也会默认调用一个方法,这个方法为__del__()方法。在python中,对于开发者来说很少会直接销毁对象(如果需要,应该使用del关键字销毁)。Python的内存管理机制能够很好的胜任这份工作。也就是说,不管是手动调用del还是由python自动回收都会触发__del__方法执行:
class Animal(object):
# 初始化方法
# 创建完对象后会自动被调用
def __init__(self, name):
print('__init__方法被调用')
self.__name = name
# 析构方法
# 当对象被删除时,会自动被调用
def __del__(self):
print("__del__方法被调用")
print("%s对象马上被干掉了..." % self.__name)
# 创建对象
dog = Animal("哈皮狗")
# 删除对象
del dog
cat = Animal("波斯猫")
cat2 = cat
cat3 = cat
print("---马上 删除cat对象")
del cat
print("---马上 删除cat2对象")
del cat2
print("---马上 删除cat3对象")
del cat3
print("程序2秒钟后结束")
输出:
__init__方法被调用
__del__方法被调用
哈皮狗对象马上被干掉了...
__init__方法被调用
---马上 删除cat对象
---马上 删除cat2对象
---马上 删除cat3对象
__del__方法被调用
波斯猫对象马上被干掉了...
程序2秒钟后结束
接下来是理解python父类子类的del:
我们重写子类的 del() 方法(父类为非 object 的类),则必须显式调用父类的 del() 方法,这样才能保证在回收子类对象时,其占用的资源(可能包含继承自父类的部分资源)能被彻底释放。为了说明这一点,这里举一个反例:
class CLanguage:
def __del__(self):
print("调用父类 __del__() 方法")
class cl(CLanguage):
def __del__(self):
print("调用子类 __del__() 方法")
c = cl()
del c
输出:
调用子类 __del__() 方法
简单总结:
1.del会自动调用,自动回收。而且只有对象的引用计数-1后为0才调用这个del()
2.父类子类里面,删除父类del,子类占用父类资源才会释放而且不输出子类的del(),而是输出父类的del()