Loading

__enter__和__exit__

__enter__(self)和__exit__(self, exc_type, exc_val, exc_tb)

with语句也叫做上下文管理协议,为了让一个对象兼容with语句,必须在这个对象的类中声明enter和exit方法。

with 对象会触发类的__enter__执行,enter的返回值就是as所赋予后面变量名的值。

with内的代码块执行完毕后就会触发__exit__的执行。

__exit__(self, exc_type, exc_val, exc_tb):三个参数分别代表异常类型、异常值和追溯信息,with语句中的代码块出现异常,则with后的代码都无法执行。

写一个Open类,模拟with上下文管理。

class Open:
    def __init__(self, path, mode='rt', encoding='utf-8'):
        self.f = open(path, mode, encoding=encoding)

    def __enter__(self):
        return self.f  # self.f会返回给as后面的变量名.

    def __exit__(self, exc_type, exc_val, exc_tb):  # 用来释放资源
        # 如果exc_type不为空,表示with上下文内部出了错误
        if exc_type:
            self.f.close()
            print('程序出错')
            raise exc_type
        self.f.close()

with Open('b.txt',mode='rt',encoding='utf-8') as f:
    print(f.read())

优点:使用with语句的目的就是把代码块放入with中执行,with结束后,自动完成清理工作,无须手动干预。

在需要管理一些资源比如文件,网络连接和锁的编程环境中,可以在exit中定制自动释放资源的机制,无须再去关心这个问题。


posted @ 2021-01-05 21:18  吃了好多肉  阅读(146)  评论(0编辑  收藏  举报