Python上下文管理器是一種特殊的對象,它允許你在執(zhí)行代碼塊之前和之后執(zhí)行一些操作
上下文管理器的工作原理是通過實現兩個特殊的方法:__enter__()
和 __exit__()
。當你使用 with
語句時,這兩個方法會按照以下順序被調用:
__enter__()
:在執(zhí)行 with
語句塊中的代碼之前調用。這個方法應該返回一個對象,這個對象將賦值給 as
子句中的變量(如果有的話)。
with
語句塊中的代碼:在這里執(zhí)行你需要的操作。
__exit__(exc_type, exc_value, traceback)
:在執(zhí)行完 with
語句塊中的代碼之后調用。這個方法用于處理在 with
語句塊中發(fā)生的異常。如果 __exit__()
方法返回 True
,則異常會被忽略;如果返回 False
或者沒有返回值,則異常會被重新拋出。
下面是一個簡單的上下文管理器的例子,用于計算代碼塊的執(zhí)行時間:
import time
class Timer:
def __enter__(self):
self.start = time.time()
return self
def __exit__(self, exc_type, exc_value, traceback):
end = time.time()
print(f"Elapsed time: {end - self.start} seconds")
with Timer() as t:
# 在這里執(zhí)行你需要的操作
time.sleep(2)
在這個例子中,Timer
類實現了上下文管理器。當你使用 with Timer() as t:
語句時,__enter__()
方法會被調用,記錄開始時間,并將 self
賦值給變量 t
。然后執(zhí)行 with
語句塊中的代碼(在這里是 time.sleep(2)
)。最后,__exit__()
方法會被調用,計算并打印出經過的時間。