python中上下文管理器和with语句
1. 上下文管理器
一个类只要实现了__enter__()和__exit__()
这个两个方法,通过该类创建的对象我们就称之为上下文管理器。
上下文管理器可以结合with语句实现简洁而强大的功能
2.定义上下文管理器对象
class File(object): # 初始化方法 def __init__(self, file_name, file_model): # 定义变量保存文件名和打开模式 self.file_name = file_name self.file_model = file_model # 上文方法 def __enter__(self): print("进入上文方法") # 返回文件资源 self.file = open(self.file_name,self.file_model) return self.file # 下文方法 def __exit__(self, exc_type, exc_val, exc_tb): print("进入下文方法") self.file.close() if __name__ == '__main__': # 使用with管理文件 with File("1.txt", "r") as file: file_data = file.read() print(file_data)
说明:
- enter方法称为上文方法,通过此方法获取操作对象
- exit方法为下文方法,用于关闭资源等操作
3.结合with语句使用:
语法
with 上下文对象() as 操作对象:
具体操作;
说明:
- with语句执行时,会调用enter方法获取到操作对象
- with语句执行完成时,不管执行过程中有没有异常,总会调用exit方法
示例:
# 使用with管理文件 with File("1.txt", "r") as file: file_data = file.read() print(file_data)
说明:上面代码完成打开文件并读取文件操作,不需要再写关闭文件功能
4.装饰器方式定义上下文管理器
@contextmanager 的装饰器,可装饰一个函数,使函数转化为一个上下文管理器,更进一步简化了上下文管理器的实现方式。通过 yield 将函数分割成两部分,yield 上面的语句在 __enter__
方法中执行,yield 下面的语句在 __exit__
方法中执行,紧跟在 yield 后面的参数是函数的返回值。
要使用contextmanager,需要导入对应模块:
from contextlib import contextmanager
装饰器法上下文管理器使用:
# 导入装饰器 from contextlib import contextmanager # 装饰器装饰函数,让其称为一个上下文管理器对象 @contextmanager def my_open(path, mode): try: # 打开文件 file = open(file_name, file_mode) # yield之前的代码好比是上文方法 yield file except Exception as e: print(e) finally: print("over") # yield下面的代码好比是下文方法 file.close() # 使用with语句 with my_open('out.txt', 'w') as f: f.write("hello , the simplest context manager")
5. open就是一个上下文管理器:
# 1、以写的方式打开文件 with open("1.txt", "w") as f: # 2、读取文件内容 f.write("hello world")
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构