描述符应用与类的装饰器
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")

更多精彩