通过实现__enter__和__exit__方法可创建上下文管理器,用于安全管理资源;如文件操作中自动打开关闭文件,确保异常时仍能正确释放资源,提升代码可读性与安全性。

在 Python 中,上下文管理器可以通过类来实现,关键在于定义 __enter__ 和 __exit__ 两个特殊方法。当使用 with 语句时,Python 会自动调用这两个方法,确保资源的正确获取和释放。
基本结构
一个实现了上下文管理器协议的类必须包含以下两个方法:
- __enter__:进入 with 语句时被调用,通常用于初始化资源(如打开文件、连接数据库等),并返回需要操作的对象。
- __exit__:退出 with 语句时被调用,无论是否发生异常都会执行,用于清理资源(如关闭文件、断开连接等)。
示例:文件操作的上下文管理器
class ManagedFile:
def __init__(self, filename, mode):
self.filename = filename
self.mode = mode
self.file = None
def __enter__(self):
print(f"打开文件: {self.filename}")
self.file = open(self.filename, self.mode)
return self.file
def __exit__(self, exc_type, exc_value, traceback):
print(f"关闭文件: {self.filename}")
if self.file:
self.file.close()
# 如果有异常,打印提示
if exc_type is not None:
print(f"出现异常: {exc_value}")
# 返回 False 表示不抑制异常;返回 True 则抑制异常
return False使用方式:
with ManagedFile("test.txt", "w") as f:
f.write("Hello, Context Manager!")
输出:
立即学习“Python免费学习笔记(深入)”;
部分功能简介:商品收藏夹功能热门商品最新商品分级价格功能自选风格打印结算页面内部短信箱商品评论增加上一商品,下一商品功能增强商家提示功能友情链接用户在线统计用户来访统计用户来访信息用户积分功能广告设置用户组分类邮件系统后台实现更新用户数据系统图片设置模板管理CSS风格管理申诉内容过滤功能用户注册过滤特征字符IP库管理及来访限制及管理压缩,恢复,备份数据库功能上传文件管理商品类别管理商品添加/修改/
关闭文件: test.txt
异常处理机制
__exit__ 方法接收三个参数:exc_type、exc_value、traceback,分别表示异常类型、异常值和栈信息。若代码块中发生异常,这三个参数将非空。
- 如果 __exit__ 返回 True,异常会被抑制,程序继续运行。
- 如果返回 False 或不返回值,异常会正常抛出。
实际应用场景
上下文管理器适合用于需要“获取-释放”模式的场景:
- 文件读写
- 数据库连接
- 线程锁的获取与释放
- 临时修改系统状态(如切换工作目录)
例如,管理数据库连接:
class DatabaseConnection:
def __enter__(self):
self.conn = connect_to_db()
return self.conn
def __exit__(self, exc_type, exc_value, traceback):
self.conn.close()基本上就这些。只要实现好 __enter__ 和 __exit__,就能写出安全可靠的资源管理类。这种模式让代码更清晰,也避免了资源泄漏问题。










