介绍
with语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭、线程中锁的自动获取和释放等
特点
- 上下文管理器提供了 __enter__()方法和__exit__()方法,在with语句中,如果用as指定了一个目标,会将__enter__()方法的返回值赋予这个目标。
- 运行中如果发生了异常,那么将会把异常的类型,值和追踪传递给__exit__()方法。如果__exit__()方法返回值为true,那么这个异常将会被抑制,否则这个异常将会被重新抛出。
- 如果没有发生异常,也会调用__exit__()方法,但是传入的参数为None, None, None。通常也是在这里放入代码进行如文件流/会话的关闭等操作。
class Person:
def __enter__(self):
print("我是enter")
def __exit__(self, exc_type, exc_val, exc_tb):
print("我是exit ")
print('exc_type', exc_type) # exc_type None
print('exc_val', exc_val) # exc_val None
print('exc_tb', exc_tb) # exc_tb None
def __call__(self, *args, **kwargs):
print("我是call")
p = Person()
p()
with p as f: # 自动调用__enter__
print("哈哈哈")
# 从with出去的时候. 自动调用__exit__
>>>
我是call
我是enter
哈哈哈
我是exit
exc_type None
exc_val None
exc_tb None