上下文相关协议的学习

Posted on 2018-02-14 14:37  阿骏骏  阅读(101)  评论(0编辑  收藏  举报

1、with obj   ——》触发obj.__enter__(),拿到返回值

2、 as  f ——》f=返回值

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

4、执行代码块

A、在没有异常的情况下,整个代码块运行完毕后去触发__exit__,它的三个参数的值都为None

B、在有异常的情况下,从异常出现的位置直接触发__exit__

 a:如果__exit__的返回值为True,代表吞掉了异常

 b:如果__exit__的返回值不为True,代表抛出了异常

 c:__exit__的运行完毕代表了整个with语句的执行完毕

 

class Foo():
    def __init__(self,name):
        self.name = name
    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)
        return True
#with 的过程是实例化的过程,触发__enter__,__enter__返回的值赋给f
#with 中的代码块在有异常触发时,直接执行__exit__方法
with Foo('aaa') as f:
    print(f.name)
    print(aaaaaaaaaa)
    print('bbbbbbbbbbbbb')
print('==============================')
View Code

 

Copyright © 2024 阿骏骏
Powered by .NET 8.0 on Kubernetes