python:上下文管理协议(即:__enter__()、__exit__() 、with……as……的简说)

#上下文管理协议;
#之前说过文件的open,可以使用  with  open()  as f  :
#其实,这个就是利用了上下文管理协议;上下文管理协议的本质,就是__enter__()、__exit__()两个方法的触发;
class Foo:
    def __init__(self,filename):
        self.filename=filename

    def __enter__(self):
        print("执行__enter__()")
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        print("执行__exit__()")
        print(exc_type)
        print(exc_val)
        print(exc_tb)#上面三个参数的打印只是为了看参数的值;
                    # 当with ...  as...代码块没有异常时,这三个参数为None;
                    #当with ...  as...代码块有异常时,这三个参数分别有对应的值(可运行代码查看值的详情)
        return True  #返回值True,会吞掉with ...  as...代码块的异常,并且结束代码块运行,但是代码块之外的代码要继续运行
                        #若,没有返回值、或者返回值不为True,一遇到with ...  as...代码块的异常,
                        # 会立即抛出异常,结束所有代码的运行,包括代码块之外的代码



if __name__ == '__main__':
    with  Foo("test.txt")  as  f:
        print("1")
        print(b)
        print("3")
    print("4")

结果:

总结:要用这个知识,需要在exit()里面定义自动释放的代码;这里的例子没有写明

猜你喜欢

转载自blog.csdn.net/ak739105231/article/details/86624814