首先使用with要求该对象支持上下文管理协议(context management protocol),简单说就是类内部实现了__enter__和__exit__方法。
内建了这两个方法的对象:
- file
- decimal.Context
- thread.LockType
- threading.Lock
- threading.RLock
- threading.Condition
- threading.Semaphore
- threading.BoundedSemaphore
自定义实现这两个方法的类:
class MyTest:
def __enter__(self):
print('******enter******')
def __exit__(self, exc_type, exc_val, exc_tb):
print('********exit********')
使用:
with MyTest() as mytest:
pass
结果:
比较常见的file:
with open(path,'w+') as f:
pass
我们都知道io操作最后都要close,很明显file使用with会在__exit__方法中内建了close的代码。