1.上下文管理协议

with obj as f:
"代码块"
1.with obj ----> 触发obj.__enter__(),拿到返回值
2.返回值赋值f,则f = 返回值
3.执行代码块
3.1.没有异常情况,整个代码块运行完毕后触发__exit__,它的三个参数都不起作用
3.2.有异常情况,从异常出现位置直接触发__exit__
3.2.1如果__exit__的返回值为True,代表吞掉异常,正常执行with函数外的语句
3.2.2如果__exit__的返回值不为True,代表吐出了异常,代码终止
3.2.3exit的运行完毕就代表了整个with语句的执行完毕
__enter__()方法和__exit__()方法的执行
class
Open: 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") with Open("a.txt") as f: #with Open("a.txt") as f, 触发__enter__(self) 方法,返回self,并赋值给f print(f) print(f.name) #结束文件时,执行__exit__操作

 return True的打开与关闭会呈现两种状态,对应上面3.2.1和3.2.2

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
class Open:
    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 Open("a.txt") as f: #with Open("a.txt") as f, 触发__enter__(self) 方法,返回self,并赋值给f
    print(f)
    print(f.name)
    #结束文件时,执行__exit__操作
    print("=========================>")
    print("=========================>")
    print("=========================>")
    print("=========================>")
    print("=========================>")
    print(asdfsdfsdfsssssdsdddddddddddddddddddd) #本行代码出现异常,跳过with..as..中代码,直接执行with..as..外代码
    print("=========================>")
    print("=========================>")
    print("=========================>")
    print("=========================>")
    print("=========================>")
print("00000000000000000000000000000000000")

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄