python上下文管理协议,即with的详细使用

一、with obj as f:

#代码块...

 

二、执行流程:

1.with obj --->触发obj.__enter__(),需要在obj里写__enter__(self),在它里边写返回值,返回给 as f 

2.with obj as f 等同于 f = obj.__enter__()

3.执行with代码块里的程序

4.执行正常时,顺序执行obj中的__exit__()方法,exc_type, exc_val, exc_tb的值都是None.

存在异常时,__exit__()方法中

a. return False返回假时,抛出系统异常。

b. return True 返回假时,吞掉系统异常,自己定制异常信息。

 

三、它的作用:自动清理/释放代码块中程序占用的资源,无须考虑这些问题

class Foo:
    def __init__(self,aa):
        self.aa = aa
    def __enter__(self):
        print('run enter')
        return self
    def __exit__(self, exc_type, exc_val, exc_tb):
        print('run exit')
        print(exc_type)#异常类 如:NameError
        print(exc_val)#异常值 如:name 'myname' is not defined
        print(exc_tb)#追踪信息 如:Traceback (most recent call last): xxxx
        return True
with Foo(11) as cc:
    print(cc.aa)
    print(cc.ff)
print('ssss')

 

 

常见的异常组成部分

Traceback (most recent call last):(追踪信息开始)

  File "D:/workSpace/purePython3/异常.py", line 1, in <module>

    myname(追踪信息结束)

NameError(异常类): name 'myname' is not defined(异常值)

 

posted @ 2018-03-11 00:00  Python信仰  阅读(964)  评论(0编辑  收藏  举报