__enter__ 和 __exit__上下文管理协议


class F:
def __init__(self,n):
self.n = n

def __enter__(self):
print('执行enter')
return self

def __exit__(self, exc_type, exc_val, exc_tb):
print('执行exit')
print('exc_type-->',exc_type) #exc_type--> <class 'NameError'>
print('exc_val-->',exc_val) #exc_val--> name 'xxxxxxxxxxxxxxxxxxxxxxxxx' is not defined
print('exc_tb-->',exc_tb) #exc_tb--> <traceback object at 0x02EB25F8>
return True #exc_type exc_val exc_tb;return True就是把上面这3个异常关闭了

with F('a.txt') as f: #触发__enter__运行,并且返回了return self
print(f) #<__main__.F object at 0x037FB4D0>,然后会接着运行__exit__
print(xxxxxxxxxxxxxxxxxxxxxxxxx) #给个错误的打印 触发了__exit__,后面的代码不会运行了
print('----------->')
print('----------->')
print('----------->')
print('----------->')
print('没有执行')
总结:
  1 没有异常的情况下,整个代码块运行完毕后在触发__exit__,它的的三个值全部为none
  2 有异常的情况下面,从异常出现的位置直接触发__exit__
   a: 如果__exit__返回值为True,代表关闭异常
b: 如果不为True,代表释放出异常
c: __exit__运行完毕就代表整个with语句执行完毕

用途或者说好处:

1.使用with语句的目的就是把代码块放入with中执行,with结束后,自动完成清理工作,无须手动干预

2.在需要管理一些资源比如文件,网络连接和锁的编程环境中,可以在__exit__中定制自动释放资源的机制,你无须再去关系这个问题,这将大有用处






原文地址:https://www.cnblogs.com/ajaxa/p/9068936.html