Python上下文管理器进阶教程:资源管理与实现
作者:归人云淡风轻
时间:2026-02-04
浏览:8
上下文管理器是支持__enter__和__exit__方法的对象,确保资源在with代码块进入前准备、退出后清理,即使发生异常也可靠执行释放逻辑。
本文目录
上下文管理器是支持__enter__和__exit__方法的对象,确保资源在with代码块进入前准备、退出后清理,即使发生异常也可靠执行释放逻辑。

什么是上下文管理器:不只是 with 语句
上下文管理器本质是一个支持 __enter__ 和 __exit__ 方法的对象。当你用 with 语句时,Python 自动调用这两个方法,确保资源在进入代码块前被准备、退出后被清理——哪怕中间发生了异常。它不是语法糖,而是明确的生命周期契约。
为什么必须用上下文管理器管理资源
文件、数据库连接、锁、临时状态等资源,若仅靠手动 close() 或 release(),极易因忘记调用、提前 return、或异常跳过而泄漏。上下文管理器把“获取-使用-释放”三步绑定为原子行为,__exit__ 在任何退出路径下都会执行(包括 raise、return、break),这是 try/finally 的可靠封装,但更简洁、更可复用。
手写一个实用的上下文管理器
以临时修改环境变量为例,说明如何自定义:
- 在 __enter__ 中保存原值并设置新值
- 在 __exit__ 中无条件恢复原值(即使发生异常也要还原)
- __exit__ 接收三个参数:
exc_type, exc_value, traceback;返回True可抑制异常,一般不建议,除非你明确要吞掉错误
示例代码:
class temp_env:
def __init__(self, **env_vars):
self.env_vars = env_vars
self.old_values = {}
def __enter__(self):
for key in self.env_vars:
self.old_values[key] = os.environ.get(key)
os.environ.update(self.env_vars)
return self
def __exit__(self, exc_type, exc_val, exc_tb):
for key, old_val in self.old_values.items():
if old_val is None:
os.environ.pop(key, None)
else:
os.environ[key] = old_val
用法:with temp_env(PATH="/tmp/bin"): do_something() ——退出后 PATH 自动回滚。
用 contextlib 简化开发
不需要每次都写类。常用方式有两类:
- @contextmanager 装饰器:用生成器函数定义上下文逻辑,
yield前是 __enter__,之后是 __exit__(自动处理异常传播) - contextlib.closing():包装已有 close() 方法的对象,如
with closing(urlopen(url)) as f: - contextlib.nullcontext():占位上下文,用于条件分支中统一 with 结构(比如某些情况无需资源管理)
例如用 @contextmanager 写日志开关:
@contextmanager
def log_level(level):
old = logger.level
logger.setLevel(level)
try:
yield
finally:
logger.setLevel(old)
调用:with log_level(logging.DEBUG): run_test()。
作者最新文章
AO3最新可用链接及中文入口汇总
2026-10-29 13:32
coreldraw怎么插入图片 图片导入步骤
2026-10-27 15:37
coreldraw快捷键冲突 怎么改 自定义按键解决
2026-10-24 08:50
AO3中文界面设置指南与核心功能使用教程
2026-10-14 23:28
解决win10运行3DMAX自动重启的方法
2026-10-13 17:08
上一篇:
时雨天气关闭通知提醒方法
下一篇:
Diskpart分区命令详解与使用方法
热门文章
更多
精品专题
更多
Mac软件
更多
WINDOWS
更多

































