Python 的对象天生拥有一些神奇的方法,它们总被双下划线所包围,它们是面向对象的 Python 的一切。它们是可以给你的类增加魔力的特殊方法,如果你的对象实现(重载)了某一个魔法方法,那么这个方法就会在特殊的情况下自动被 Python 所调用。
功能
析构器,定义对象在内存中被释放时的行为。
参数
self 代表对象本身,也可以有其他参数。
应用场景
Python自带垃圾回收机制,但它只能回收用户级资源,而不能自动回收系统资源。故当一个对象同时拥有用户级(Python程序)与内核级(系统)两种资源时,就必须在清除对象的同时回收系统资源(如关闭文件等),这就用到了__del__方法。
__del__
方法是当对象被系统回收的时候调用的魔法方法,在对象生命周期调用结束时调用该方法。
Python 采用自动引用计数(ARC)方式来回收对象所占用的空间,当程序中有一个变量引用该 Python 对象时,Python 会自动保证该对象引用计数为 1;当程序中有两个变量引用该 Python 对象时,Python 会自动保证该对象引用计数为 2,依此类推,如果一个对象的引用计数变成了 0,则说明程序中不再有变量引用该对象,表明程序不再需要该对象,因此 Python 就会回收该对象。所以大部分时候,都不需要我们手动去删掉不再使用的对象,python的回收机制会自动帮我们做这件事。
示例代码:
class A(object):
def __init__(self, a):
print('this is A init')
self.a = a
def __del__(self):
print('this is magic method del')
m = A(1)
运行结果:
this is A init
this is magic method del
class MyText(object):
def __init__(self, file_name):
self.file_name = file_name
def __del__(self):
self.file_name.close()
del self.file_name
print('我被回收了哦')
sample = MyText(open('b.txt', 'a'))
print('1234', file=sample.file_name)
sample1 = sample
del sample
print('----------')
执行结果:
----------
我被回收了哦
1、并不是对一个变量执行 del 操作,该变量所引用的对象就会被回收,只有当对象的引用计数变成 0 时,该对象才会被回收。
2、如果父类提供了 __del__方法,则子类重写 __del__方法时必须显式调用父类的 __del__方法,这样才能保证合理地回收父类实例的部分属性。