python上下文管理器
Python中的上下文管理器(Context Manager) 是一种用于自动管理资源(如文件、网络连接、锁等)的机制,确保资源在使用后被正确释放,避免资源泄漏或忘记关闭的问题。核心是通过 with 语句实现。
核心概念
-
协议方法:
__enter__():进入上下文时调用,返回资源对象(如打开的文件)。__exit__():退出上下文时调用,处理资源清理(如关闭文件),并处理异常。
-
工作流程:
with 上下文管理器 as 资源对象: 代码块等价于:
资源对象 = 上下文管理器.__enter__() try: 代码块 finally: 上下文管理器.__exit__(异常类型, 异常值, 异常栈)
使用场景
-
文件操作(避免忘记关闭):
with open("test.txt", "r") as f: # 自动调用 f.__enter__() data = f.read() # 退出时自动调用 f.__exit__() 关闭文件 -
线程锁(确保锁被释放):
import threading lock = threading.Lock() with lock: # 自动获取和释放锁 # 临界区代码 -
数据库连接(自动关闭连接):
with psycopg2.connect(DATABASE_URL) as conn: cursor = conn.cursor() cursor.execute("SELECT * FROM users")
自定义上下文管理器
方法1:类实现协议
class FileManager:
def __init__(self, filename, mode):
self.filename = filename
self.mode = mode
def __enter__(self):
self.file = open(self.filename, self.mode)
return self.file # 返回资源对象
def __exit__(self, exc_type, exc_val, exc_tb):
self.file.close() # 清理资源
if exc_type: # 可选:处理异常
print(f"Error: {exc_val}")
return False # 若返回True,则抑制异常
# 使用
with FileManager("log.txt", "w") as f:
f.write("Hello Context Manager!")
方法2:contextlib 装饰器(更简洁)
from contextlib import contextmanager
@contextmanager
def file_manager(filename, mode):
try:
f = open(filename, mode)
yield f # 返回资源对象
finally:
f.close() # 确保关闭
# 使用
with file_manager("data.txt", "r") as f:
print(f.read())
关键优势
- 资源安全:自动清理资源(如文件、锁、连接)。
- 代码简洁:避免冗余的
try-finally代码。 - 异常处理:在
__exit__()中统一处理异常。
面试笔记
- 核心:
__enter__+__exit__协议。 - 场景:文件、锁、网络连接、数据库等需释放的资源。
- 工具:内置类型(如
open())或contextlib快速实现。 - 对比:比手动
try-finally更简洁安全。

浙公网安备 33010602011771号