首页 > Python资料 博客日记
Python教程(27)——如何使用Python中的上下文管理器
2024-02-24 16:55:30Python资料围观163次
当我们在编写代码时,经常会遇到需要管理资源的情况,比如打开和关闭文件,如果遇到了一些异常情况,我们需要关闭资源,不然会导致资源泄露,虽然我们可以通过手动的方式来关闭,但如果有多个异常情况需要考虑的话,万一不小心漏了一处,就芭比Q了。所以,如果有一种更加优雅的方式来处理资源泄露的问题,那必定是非常nice的。而上下文管理器就是在这样的背景下诞生的。
上下文管理器
上下文管理器(Context Manager)是 Python 中用来管理资源、执行特定操作以及处理异常的对象。上下文管理器通过实现特定的方法使得它们可以在 with 语句中被使用,确保资源的正确获取和释放。
在 Python 中,上下文管理器通常使用类中的特殊方法 __enter__ 和 __exit__ 来实现。具体来说:
1、 __enter__ 方法在进入 with 语句块时被调用,通常用于获取资源或者执行一些初始化操作,一般返回管理器对象。
2、 __exit__ 方法在离开 with 语句块时被调用,无论代码块中是否发生异常,该方法都会被执行。这个方法通常用来释放资源,清理工作以及处理异常情况。放法中含有三个参数分别是:异常类型、异常实例对象和异常栈对象
class MyContextManager:
def __enter__(self):
print("Entering the context")
# 执行一些初始化操作,比如打开资源
return self
def __exit__(self, exc_type, exc_value, traceback):
print("Exiting the context")
# 执行一些清理操作,比如关闭资源
if exc_type is not None:
print(f"Exception: {exc_type}, {exc_value}")
# 返回 True 表示异常已经被处理,返回 False 则异常会被传播
return True
# 使用上下文管理器
with MyContextManager() as manager:
print("Inside the context")
# 执行一些操作,比如读写资源
# 如果在这里发生了异常,异常会被传递给 __exit__ 方法进行处理
比如上面的这个示例中,MyContextManager 是一个简单的上下文管理器类,通过实现 __enter__ 和 __exit__ 方法来定义上下文管理器的行为。在 with 语句块中使用该上下文管理器,会执行相应的操作(进入、执行、退出上下文),确保资源的正确管理。
上面的代码运行结果:
Entering the context
Inside the context
Exiting the context
with语句
很多人说with语句是用来创建上下文管理器,准确的说,这样子的说法是不对的。之前的例子中,MyContextManager
是一个上下文管理器的类,而我们所谓的创建上下文管理器,无非就是创建上下文管理器的对象。那么以下这样子不就是创建了一个上下文管理器对象吗?
m = MyContextManager()
所以准确的说,with语句是Python提供的一种管理上下文的语法结构,能够自动调用上下文管理器的__enter__和__exit__方法。通过with语句,可以确保在进入和退出代码块时自动执行必要的操作。
例如,使用with
语句的上下文管理器来打开和关闭文件:
with open('example.txt', 'r') as file:
content = file.read()
print(content)
# 文件在with语句块结束后会自动关闭,即使发生异常也会正确关闭文件
open函数返回的文件对象是一个上下文管理器,本身就不需要再去实现了,通过使用with关键字,确保在代码块执行完毕后文件会被正确关闭。无需手动调用 file.close()
方法。这样可以提高代码可读性和可维护性,避免忘记关闭文件而导致资源泄漏的问题。
当然我们也可以自己手动实现一个file上下文管理器
class FileContextManager:
def __init__(self, file_name, mode):
self.file_name = file_name
self.mode = mode
def __enter__(self):
self.file = open(self.file_name, self.mode)
return self.file
def __exit__(self, exc_type, exc_value, exc_traceback):
if self.file:
self.file.close()
# 使用自定义的文件上下文管理器类来打开文件
with FileContextManager('example.txt', 'w') as file:
file.write("程序员一点来啦!")
这个就是一个比较简单的文件上下文管理器,FileContextManager('example.txt', 'w')
和上面open('example.txt', 'r')
功能是差不多的。
以上就是关于上下文管理器的一些简单介绍。总的来说,上下文管理器是 Python 提供的一种非常方便的资源管理机制,可以帮助我们更好地管理和释放资源,简化代码逻辑,提高代码的健壮性,写出更加优雅的代码,在项目开发中使用起来非常的舒服。
更多精彩内容,请关注同名公众:一点sir(alittle-sir)
标签:
相关文章
最新发布
- 【Python】selenium安装+Microsoft Edge驱动器下载配置流程
- Python 中自动打开网页并点击[自动化脚本],Selenium
- Anaconda基础使用
- 【Python】成功解决 TypeError: ‘<‘ not supported between instances of ‘str’ and ‘int’
- manim边学边做--三维的点和线
- CPython是最常用的Python解释器之一,也是Python官方实现。它是用C语言编写的,旨在提供一个高效且易于使用的Python解释器。
- Anaconda安装配置Jupyter(2024最新版)
- Python中读取Excel最快的几种方法!
- Python某城市美食商家爬虫数据可视化分析和推荐查询系统毕业设计论文开题报告
- 如何使用 Python 批量检测和转换 JSONL 文件编码为 UTF-8
点击排行
- 版本匹配指南:Numpy版本和Python版本的对应关系
- 版本匹配指南:PyTorch版本、torchvision 版本和Python版本的对应关系
- Python 可视化 web 神器:streamlit、Gradio、dash、nicegui;低代码 Python Web 框架:PyWebIO
- 相关性分析——Pearson相关系数+热力图(附data和Python完整代码)
- Python与PyTorch的版本对应
- Anaconda版本和Python版本对应关系(持续更新...)
- Python pyinstaller打包exe最完整教程
- Could not build wheels for llama-cpp-python, which is required to install pyproject.toml-based proj