首先介绍
上下文管理器协议:包含__enter__()和__exit__()方法
支持该协议的对象,称为上下文管理器
上下文管理器的本质:支持with操作
语句体:with 语句包裹起来的代码块
在执行语句体之前会调用__enter__(),执行完语句体会调用__exit__()
实现一个上下文管理器的方式有两种
- 类中实现__enter__()和__exit__()方法
- 使用contextmanager装饰函数
代码示例:实现一个计算代码执行时间计算的上下文管理对象
基于类实现
import time
class Timer:
def __enter__(self):
self.start_time = time.time()
def __exit__(self, exc_type, exc_val, exc_tb):
self.end_time = time.time()
time_diff = self.end_time - self.start_time
print(time_diff)
with Timer():
# 语句体
num_list = [i for i in range(100000)]
基于装饰器实现
import contextlib
import time
@contextlib.contextmanager
def timer():
start_time = time.time()
yield
end_time = time.time()
print(end_time - start_time)
with timer():
# 语句体
num_list = [i for i in range(100000)]