面向对象高阶-06\_\_del\_\_
__del__
__del__也称之为析构方法
__del__会在对象被删除之前自动触发
执行时机: 手动删除对象时立马执行,或是程序运行结束时也会自动执行
上例子
列子一
class People:
def __init__(self, name, age):
self.name = name
self.age = age
self.f = open(da, 'w', encoding='utf-8')
def __del__(self):
print('run======>')
# 做回收系统资源相关的事情
self.f.close()
obj = People('egon', 18)
del obj # del obj会间接删除f的内存占用,但是还需要自定制__del__删除文件的系统占用
print('apan')
run=-====>
apan
列子二
class FileTool:
"""该类用于简化文件的读写操作 """
def __init__(self,path):
self.file = open(path,"rt",encoding="utf-8")
self.a = 100
def read(self):
return self.file.read()
# 在这里可以确定一个事,这个对象肯定不使用了 所以可以放心的关闭问文件了
def __del__(self):
self.file.close()
tool = FileTool("a.txt")
print(tool.read())
典型的应用场景:
创建数据库类,用该类实例化出数据库链接对象,对象本身是存放于用户空间内存中,而链接则是由操作系统管理的,存放于内核空间内存中
当程序结束时,python只会回收自己的内存空间,即用户态内存,而操作系统的资源则没有被回收,这就需要我们定制__del__,在对象被删除前向操作系统发起关闭数据库链接的系统调用,回收资源
这与文件处理是一个道理:
f=open('a.txt') #做了两件事,在用户空间拿到一个f变量,在操作系统内核空间打开一个文件
del f #只回收用户空间的f,操作系统的文件还处于打开状态
#所以我们应该在del f之前保证f.close()执行,即便是没有del,程序执行完毕也会自动del清理资源,于是文件操作的正确用法应该是
f=open('a.txt')
读写...
f.close()
很多情况下大家都容易忽略f.close,这就用到了with上下文管理