上下文管理器和with块
上下文管理器对象存在的目的是为了管理with块,就像迭代器的存在是为了管理for循环一样
with 语句存在的意义是对一些常用的 try/finally 结构予以简化。这种结构能够保障一段代码在运行完成后实施某项操作,就算该段代码因为 return 语句、异常或者 sys.exit() 调用而停止,也依旧执行指定的操作。finally 子句中的代码往往用于释放重要的资源,亦或是还原临时变动的状态。
上下文管理器接口包含了__enter__以及__exit__这两个方法。当 with 语句开始执行的时候,Python 会在上下文管理器对象上启用__enter__方法。待 with 块运行完毕,或者因某些缘由终止之后,Python 会在上下文管理器对象上调用__exit__方法。
- __enter()__方法:当进入
with
语句时,__enter__()
方法会被调用。该方法通常用于执行一些准备工作,并返回一个资源对象,这个对象会被绑定到as
后的变量名上。 - __exit()__方法:当
with
语句块执行结束时,无论是否发生了异常,__exit__()
方法都会被调用。该方法通常用于执行一些清理操作,比如关闭文件、释放资源等。如果在with
语句块中发生了异常,异常信息会作为参数传递给__exit__()
方法。
下面是一个精心设计的上下文管理器执行操作案例
import sysclass LookingGlass:def __enter__(self):# 将原始的 sys.stdout.wri