with-as 语句

with-as语句又成为上下文管理协议,其结构如下:

with expression [as variable]:
    with-block

with 所求值的对象,即 expression 表达式所得到的对象必须有一个 __enter__() 方法和一个 __exit__() 方法。

with-as语句执行流程:

1)首先执行返回对象的 __enter__ 函数,它的返回值会赋给 as 后面的 variable 变量,如果不写as variable,返回值会被忽略。

2)开始执行 with-block 中的语句。

3)不论步骤2)执行成功还是失败,最后都会执行对象的__exit__函数。__exit__函数的返回值用来指示 with-block 部分发生的异

   常是否要 re-raise,如果返回 False,则会 re-raise with-block 的异常,如果返回 True,则就像什么都没发生。

搞懂了 with 语句的执行流程,我们知道:为了让一个对象兼容 with 语句,我们需要实现 __enter__() 和 __exit__() 方法。

接下来我们来自定义一个可以用 with 语句来管理的类型。

class test(object):
    def __enter__(self):
        print("call __enter__")
        return 1

    def __exit__(self,*args):
        print("call __exit__")
        return True    # 改为False则会报出异常

with test() as t:
    print("t is {0}".format(t))
    raise NameError("Hi there")

with-as 语句常用于打开文件当中,因为文件对象也实现了__enter__和__exit__这两个函数,所以可以用with来管理。

 

posted @ 2020-06-23 16:45  _yanghh  阅读(513)  评论(0编辑  收藏  举报