第二十一讲 python中的with上下文资源管理器

目录

1.基本概念

[2.with 语句的工作流程](#2.with 语句的工作流程)

[3. 自定义上下文管理器](#3. 自定义上下文管理器)

[4. enterexit 方法详解](#4. enterexit 方法详解)

[5. 示例](#5. 示例)


  • with 语句用于简化资源管理,确保资源在使用后得到适当的清理。它通过上下文管理器(context manager)来实现这一点。
  • 上下文管理器是实现了 __enter____exit__ 方法的对象。
  • with上下文管理可以自动管理资源,在with代码块执行完毕后自动还原进入该代码之前的现场或上下文。不论何种原因跳出with 块,不论是否有异常,总能保证资源正常释放。极大的简化了工作,在文件操作、网络通信相关的场合非常常用

1.基本概念

  • 上下文管理器:一个对象,它定义了资源的获取和释放逻辑。
  • with 语句:语法结构,用于管理上下文,即资源的打开和关闭。

2.with 语句的工作流程

  • __enter__ 方法 :在 with 语句块开始时调用。它可以用于资源的初始化和准备。此方法的返回值可以被赋值给 as 后的变量。
  • __exit__ 方法 :在 with 语句块结束时调用,无论是正常结束还是由于异常结束。它负责清理资源并可以处理异常。

例子:

python 复制代码
with open('file.txt', 'r') as file:
    content = file.read()
# 文件会在 with 块结束时自动关闭,无需显式调用 file.close()

3. 自定义上下文管理器

python 复制代码
class MyContextManager:
    def __enter__(self):
        print("Entering the context")
        # 初始化资源,通常返回自己或其他有用的对象
        return self
    
    def __exit__(self, exc_type, exc_value, traceback):
        print("Exiting the context")
        # 处理异常,返回 True 表示异常被处理,返回 False 让异常继续传播
        return False

# 使用自定义上下文管理器
with MyContextManager() as manager:
    print("Inside the context")
    # 在这里你可以触发异常来测试 __exit__ 方法

4. __enter____exit__ 方法详解

  • __enter__ 方法

    • 该方法在 with 语句块开始时被调用。
    • 通常用于初始化资源并可以返回一个对象(通常是 self 或某个资源)。
  • __exit__ 方法

    • 该方法在 with 语句块结束时被调用。
    • 它接受四个参数:exc_type(异常类型)、exc_value(异常值)、traceback(异常回溯)。
    • 它负责清理资源,并且可以处理异常。
    • 如果 __exit__ 返回 True,异常会被视为处理过,不会向上传播;如果返回 False,异常会继续传播。

5. 示例

  • 文件操作
python 复制代码
with open('file.txt', 'w') as file:
    file.write('Hello, world!')
  • 数据库连接
python 复制代码
class DatabaseConnection:
    def __enter__(self):
        # 连接到数据库
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        # 关闭数据库连接
        pass

with DatabaseConnection() as db:
    db.execute("SELECT * FROM table")
相关推荐
IvanCodes4 小时前
Python 基础语法(一):变量、数据类型与运算符
python
程序员三藏5 小时前
浅谈性能测试
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·性能测试
l1258655 小时前
# RAG向量数据库优化实战:HNSW索引调参与生产级性能设计
数据库·python·mysql·langchain
meilindehuzi_a6 小时前
Python 基础语法(1):常量、变量、类型、输入输出与运算符
开发语言·python
Zane19946 小时前
调用了 async 函数却没执行?一文讲透协程、event loop 与 await
后端·python
OPEN-F6 小时前
Python进阶教程:装饰器与生成器深入
开发语言·python
zhipujiaoyu6 小时前
2026年大数据专科何去何从?就业前景、发展趋势全揭秘!
大数据·python
l1258657 小时前
# RAG噪声知识库治理:一致性与可信度的四层防线设计
数据库·人工智能·python·自然语言处理·langchain
zoujiahui_20187 小时前
别再只写 np.random.seed() 了:default_rng 与 np.random、random 到底差在哪?
python
Patrick在香港7 小时前
Claude Agent 进阶:4 种工具调用编排模式,让 0820 那 13 个 endpoint 并行起来
python·ai·ai编程