第十八节:上下文管理协议
上下文管理协议:
with obj as f:
'代码块'
1.with obj ----》触发obj.__enter__(),拿到返回值
2.as f----->f=返回值、
3.with obj as f 等同于 f=obj.__enter__()
4.执行代码块
一:没有异常的情况下,整个代码块运行完毕后去触发__exit__,它的三个参数都为None
二:有异常的情况下,从异常出现的位置直接触发__exit__
a:如果__exit__的返回值为True,代表吞掉了异常,程序继续执行
b:如果__exit__的返回值不为True,代表吐出了异常,__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 Foo('a.txt') as f: print(f) print(asd) #触发__exit__,如果返回True,代码块运行完毕,程序继续执行 print(f.name) print('-----------------') print('0000')
使用场景:定制释放资源机制,网络连接和锁的编程环境
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步