博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python with 语句妙用
阅读量:6432 次
发布时间:2019-06-23

本文共 921 字,大约阅读时间需要 3 分钟。

class aa():    def bb(self):        print("hhhh")        return "hello world"    def __enter__(self): # 必须有__enter__        print("enter")        return self    def cc(self):        print("www")    def __exit__(self, exc_type, exc_val, exc_tb): # 必须有结束__exit__        print("exit")def ll():    with aa() as a:        return a.bb()res = ll()print(res)

 

结果:

enterhhhhexithello world

 

原理:自定义上下文管理器

开发人员可以自定义支持上下文管理协议的类。自定义的上下文管理器要实现上下文管理协议所需要的 __enter__() 和 __exit__() 两个方法:    context_manager.__enter__() :进入上下文管理器的运行时上下文,在语句体执行前调用。with 语句将该方法的返回值赋值给 as 子句中的 target,如果指定了 as 子句的话    context_manager.__exit__(exc_type, exc_value, exc_traceback) :退出与上下文管理器相关的运行时上下文,返回一个布尔值表示是否对发生的异常进行处理。 参数表示引起退出操作的异常,如果退出时没有发生异常,则3个参数都为None。如果发生异常,返回    True 表示不处理异常,否则会在退出该方法后重新抛出异常以由 with 语句之外的代码逻辑进行处理。如果该方法内部产生异常,则会取代由 statement-body 中语句产生的异常。 要处理异常时,不要显示重新抛出异常,即不能重新抛出通过参数传递进来的异常,只需要将返回值设置为 False 就可以了。之后,上下文管理代码会检测是否 __exit__() 失败来处理异常

 

转载地址:http://lnxga.baihongyu.com/

你可能感兴趣的文章
C#项目代码规范
查看>>
vscode常用插件
查看>>
算法的时间复杂度比较,计算多项式的直接法和秦九韶法
查看>>
SQL SERVER与C#的数据类型对应表
查看>>
Eclipse 教程
查看>>
Search in Rotated Sorted Array II
查看>>
数据库的使用
查看>>
查找数组中元素的索引位置
查看>>
BUAA-OO 第三单元作业 JML 总结与思考
查看>>
try、catch、finally、return的执行顺序
查看>>
云服务器启动tomcat巨慢,很慢
查看>>
Jmeter自带录制功能
查看>>
android studio 可以汉化的 文件 地方
查看>>
一句话提取WebView的Html
查看>>
九种排序算法分析与实现
查看>>
【简讯】PuTTY 0.61发布!
查看>>
2008反病毒市场分析:免费VS云安全
查看>>
【观点】你欠自己一个老学究的身份
查看>>
一起谈.NET技术,再次分享一个多选文件上传方案
查看>>
maven安装第三方包
查看>>