#上下文管理协议;
#之前说过文件的open,可以使用 with open() as f :
#其实,这个就是利用了上下文管理协议;上下文管理协议的本质,就是__enter__()、__exit__()两个方法的触发;
class Foo:
def __init__(self,filename):
self.filename=filename
def __enter__(self):
print("执行__enter__()")
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print("执行__exit__()")
print(exc_type)
print(exc_val)
print(exc_tb)#上面三个参数的打印只是为了看参数的值;
# 当with ... as...代码块没有异常时,这三个参数为None;
#当with ... as...代码块有异常时,这三个参数分别有对应的值(可运行代码查看值的详情)
return True #返回值True,会吞掉with ... as...代码块的异常,并且结束代码块运行,但是代码块之外的代码要继续运行
#若,没有返回值、或者返回值不为True,一遇到with ... as...代码块的异常,
# 会立即抛出异常,结束所有代码的运行,包括代码块之外的代码
if __name__ == '__main__':
with Foo("test.txt") as f:
print("1")
print(b)
print("3")
print("4")
结果:
总结:要用这个知识,需要在exit()里面定义自动释放的代码;这里的例子没有写明