Python全栈day28(上下文管理)
我们知道在操作文件对象的时候可以这么写
1 2 | with open ( 'a.txt' ,''r) as f: 代码 |
上述叫做上下文管理协议,即with语句,为了让一个对象兼容with语句,必须在这个对象的类中声明__enter__和__exit__方法
上下文管理协议.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | class Open : 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' ) #with触发的是__enter__ #返回的是self with Open ( 'a.txt' ) as f: print ( '===>' ) print ( '===>' ) print ( '===>' ) print (f) print (f.name) #执行完毕with会触发__exit__的运行 |
正常是在with Open的时候执行__enter__然后执行with下面代码,如果执行代码没有出错exc_type, exc_val, exc_tb的值均为None
假如在with下面执行出现错误则直接跳到__exit__并且不执行往下的代码
上下文管理协议2.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | class Open : 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' ,exc_type) print ( '这是exc_cal' ,exc_val) print ( '这是exc_tb' ,exc_tb) #with触发的是__enter__ #返回的是self with Open ( 'a.txt' ) as f: #f是self print (f) print (asdaddgdfg) #打印出对应的属性 print (f.name) #执行完毕with会触发__exit__的运行 print ( '0000000' ) |
exc_type, exc_val, exc_tb 三个参数分别对应异常类,异常值,异常追踪信息
如果在__exit__返回一个True则不会报错而把对应的错误输出,不会执行with接着的语句print(f.name),但是会继续执行with下面的语句print('0000000')
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | lass Open : 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' ,exc_type) print ( '这是exc_cal' ,exc_val) print ( '这是exc_tb' ,exc_tb) return True #with触发的是__enter__ #返回的是self with Open ( 'a.txt' ) as f: #f是self print (f) print (asdaddgdfg) #打印出对应的属性 print (f.name) #执行完毕with会触发__exit__的运行 print ( '0000000' ) |
输出如下没有报错(exit把异常吞掉了)
PS:exit运行完毕,with也就结束了
用途或者说好处:
1.使用with语句的目的就是把代码块放入with中执行,with结束后,自动完成清理工作,无须手动干预
2.在需要管理一些资源比如文件,网络连接和锁的编程环境中,可以在__exit__中定制自动释放资源的机制,你无须再去关心这个问题,这将大有用处
PS:python异常包含3部分
分类:
Python全栈开发
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!