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来管理。