关于with和上下文管理器的执行过程和原理
2018-04-23 17:05
120 查看
版权声明:转载请注明出处 https://blog.csdn.net/fanlei5458/article/details/80045424with的作用
1)计算表达式的值,返回一个上下文管理器的对象
2)加载上下文管理器对象的__exit__()方法以备使用
3)调用上下文的__enter__方法
4)如果with与语句中设置了目标对象,则将__enter__()的返回值赋值给目标对象
5)执行with中的代码块
6)如果步骤5代码正常结束,调用上下文的__exit__()方法,其返回值将被忽略
7)如果步骤5执行过程中抛出异常,调用上下文的__exit__()方法,
并将异常类型.值即traceback信息作为参数传递给__exit__()方法.
如果__exit__的值为false,则异常会被重新抛出,如果为True,
异常被挂起,程序继续执行
阅读更多
说通俗易懂一点就是当with语句执行完之后,with会自动帮我们关闭或断开对象所占用的系统资源.实现了上下文管理协议的对象都可以被with作用.下面是最简单的一个关于with的使用
def fun():with open("output.txt", "w") as f:f.write("Python之禅")open 方法的返回值赋值给变量 f,当离开 with 代码块的时候,系统会自动调用 f.close() 方法.
下面介绍什么是上下文管理器.
任何实现了 __enter__() 和 __exit__() 方法的对象都可称之为上下文管理器,其中__enter__必须返回一个可以操作的对象,__exit__()处理一些清除工作.
请看下面例子,模拟了一个使用open()打开文件的上下文管理器.
class File():def __init__(self, filename, mode):self.filename = filenameself.mode = modedef __enter__(self):print("entering")self.f = open(self.filename, self.mode)return self.fdef __exit__(self, *args):print("will exit")self.f.close()File这个类实现了上下文管理器,就可以使用with了
with File('out.txt', 'w') as f:print("writing")f.write('hello, python')with语句的代码块执行过程:
1)计算表达式的值,返回一个上下文管理器的对象
2)加载上下文管理器对象的__exit__()方法以备使用
3)调用上下文的__enter__方法
4)如果with与语句中设置了目标对象,则将__enter__()的返回值赋值给目标对象
5)执行with中的代码块
6)如果步骤5代码正常结束,调用上下文的__exit__()方法,其返回值将被忽略
7)如果步骤5执行过程中抛出异常,调用上下文的__exit__()方法,
并将异常类型.值即traceback信息作为参数传递给__exit__()方法.
如果__exit__的值为false,则异常会被重新抛出,如果为True,
异常被挂起,程序继续执行
阅读更多
相关文章推荐
- 关于jQuery的getScript()实现动态js加载,原理,实现过程是怎么样的?
- koa执行过程原理分析
- 【编译原理】程序的编译链接执行过程
- oracle rownum用法关于分页,只要看懂了原理,你就明白了,也算是自己学习过程的一个思考
- Executor框架线程池任务执行全过程原理
- 关于登录linux时,/etc/profile、~/.bash_profile等几个文件的执行过程
- 关于 switch 语句的执行过程
- 关于javascript中的 执行上下文和对象变量
- 执行具有root权限的java代码 am pm的实现过程原理
- MapReduce程序运行原理及其执行过程
- 关于RxJava,Scheduler 调度器,map事件转换的过程与原理
- 关于登录linux时,/etc/profile、~/.bash_profile等几个文件的执行过程
- 关于stretchableImageWithLeftCapWidth:topCapHeight方法的原理
- struts2实例执行过程,以及原理
- 关于stretchableImageWithLeftCapWidth:topCapHeight:方法的原理介绍
- paparazzi 关于imu及baro的配置及执行过程分析
- Oracle9i中关于select into的执行过程 (转)
- java 执行过程 运行原理
- Spring3.1.0实现原理分析(十).AOP之代理对象执行拦截过程
- 关于 c#导出 excel 遇到只能在执行 Render() 的过程中调用 RegisterForEventValidation的问题