__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中定制自动释放资源的机制,无须再去关心这个问题。