面向对象高阶-06\_\_del\_\_

__del__

__del__也称之为析构方法
__del__会在对象被删除以前自动触发
执行时机: 手动删除对象时立马执行,或是程序运行结束时也会自动执行
上例子
列子一python

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())

典型的应用场景:操作系统

建立数据库类,用该类实例化出数据库连接对象,对象自己是存放于用户空间内存中,而连接则是由操做系统管理的,存放于内核空间内存中code

当程序结束时,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上下文管理
相关文章
相关标签/搜索