Python---上下文管理器
目录
上下文管理器
✅ 上下文管理器的作用
自定义实现一个上下文管理器
🔍 参数详解:__exit__ 的三个参数
🧠 控制异常传播
🧰 常用模块与工具
✅ 小结
上下文管理器
上下文管理器(Context Manager) 是一种用于简化资源管理的机制,最常用于处理文件、网络连接、数据库连接等需要“打开”和“关闭”的操作。上下文管理器通过 with
语句来使用,确保资源在使用完毕后被正确释放,即使在使用过程中发生异常也不会泄露资源。
在任何一门编程语言中,文件的输入输出、数据库的连接断开等,都是很常见的资源管理操作。但资源都是有限的,在写程序时,我们必须保证这些资源在使用过后得到释放,不然就容易造成资源泄露,轻者使得系统处理缓慢,重则会使系统崩溃。
✅ 上下文管理器的作用
- 自动管理资源(如文件、锁、连接等)
- 确保资源在使用后被释放(如关闭文件、释放锁、断开连接等)
- 即使代码中抛出异常也能确保清理操作被执行
自定义实现一个上下文管理器
这个方法表示我们正在进入文件操作,这里是放置所有初始化代码的地方
比如打开文件时的所有操作
__enter__
:在进入with
语句块时被调用,通常用于初始化资源(如打开文件、获取锁等)。__exit__
:在离开with
语句块时被调用,通常用于清理资源(如关闭文件、释放锁等),即使发生异常也会执行。
🔍 参数详解:__exit__
的三个参数
参数名 | 类型 | 说明 |
| type 或 None | 异常类型,如 |
| Exception 或 None | 异常实例,如 |
| traceback 或 None | 异常的堆栈信息对象 |
- 如果
with
块中没有异常,这三个参数都是None
。 - 如果有异常发生,这三个参数会包含异常信息。
🧠 控制异常传播
在 __exit__
中返回值决定是否抑制异常:
- 返回
True
:表示异常已被处理,不再传播。 - 返回
False
或不返回值:异常会继续向上抛出。
方法名 | 调用时机 | 作用 |
| 进入 块前 | 初始化资源,返回值赋给 后的变量 |
| 离开 块时(无论是否异常) | 清理资源,可处理异常 |
🧰 常用模块与工具
contextlib
:提供创建上下文管理器的工具,如:
-
contextmanager
:装饰器创建生成器上下文管理器closing
:为没有__exit__
的对象添加关闭行为redirect_stdout
,redirect_stderr
:重定向输出
threading.Lock()
:线程锁可以作为上下文管理器使用decimal.localcontext()
:用于临时修改 decimal 的上下文精度
✅ 小结
特性 | 说明 |
上下文管理器 | 管理资源生命周期 |
使用 语句 | 简洁安全 |
实现方式 | 类( / )或 |
异常处理 |
可以捕获并处理异常 |
推荐标准库模块 |
提供了许多实用工具 |