2019年9月15日 上下文管理协议 __enter__ 和 __exit__
复习with 与open:
with open ('test2.txt') as f:#自动会关闭文件,不需要再写close print(f.readlines()) g=open('test2.txt','r') print(g.readlines()) g.close()
with obj as f:#相当于 f=obj.__enter__()
‘代码块’
with obj >>>>>触发obj.__enter__(),拿到返回值。
as f >>>>>> f=返回值
执行代码块
1.无异常,全部运行好后执行__exit__,三个参数为none
2.有异常,从异常出现的位置触发__exit__
2.a 如果__exit__的返回值为true,代表吞掉异常
2.b 如果__exit__的返回值不会true,代表吐出异常
2.c exit的运行完毕代表整个with语句执行完毕
用途:
1.用with语句把代码块放入with中执行,with结束后自动完成清理工作
2.在需要管理一些资源的时候,比如文件,网络连接和锁的环境中,可以用__exit__中定制自动释放资源的机制
class OpenX: def __init__(self,name): self.name=name def __enter__(self): print('do enter') return self# 触发enter返回self,并赋值给f def __exit__(self, exc_type, exc_val, exc_tb): print('do exit') print('exc_type异常的类:',exc_type) print('exc_val异常的内容',exc_val) print('exc_tb异常的追踪:',exc_tb) return True #通过返回True 解决抛出异常。 with OpenX('test2.txt') as f:#确实是在实例化,但是不等同于在做实例化f=OpenX('test2.txt'),因为有with会触发enter,enter返回的值赋予给f print(f.__dict__) print('do with as f') print(xxx) #如果没有意外情况则反馈None,有意外则会触发exit,并且break跳出with运行 print('这行不运行') print('>>>>>>>>>>>>\n','exit是在open关闭时候才会触发,所以在这一行上面会有exit')
》》》》》》》》》》》
do enter
{'name': 'test2.txt'}
do with as f
do exit
exc_type异常的类: <class 'NameError'>
exc_val异常的内容 name 'xxx' is not defined
exc_tb异常的追踪: <traceback object at 0x10077f488>
>>>>>>>>>>>>
exit是在open关闭时候才会触发,所以在这一行上面会有exit
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步