1、with obj ——》触发obj.__enter__(),拿到返回值
2、 as f ——》f=返回值
3、with obj as f 等同于 f=obj.__enter__()
4、执行代码块
A、在没有异常的情况下,整个代码块运行完毕后去触发__exit__,它的三个参数的值都为None
B、在有异常的情况下,从异常出现的位置直接触发__exit__
a:如果__exit__的返回值为True,代表吞掉了异常
b:如果__exit__的返回值不为True,代表抛出了异常
c:__exit__的运行完毕代表了整个with语句的执行完毕
class Foo(): def __init__(self,name): self.name = name 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) return True #with 的过程是实例化的过程,触发__enter__,__enter__返回的值赋给f #with 中的代码块在有异常触发时,直接执行__exit__方法 with Foo('aaa') as f: print(f.name) print(aaaaaaaaaa) print('bbbbbbbbbbbbb') print('==============================')