第二十一讲 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")
相关推荐
AIAdvocate1 小时前
Pandas_数据结构详解
数据结构·python·pandas
小言从不摸鱼1 小时前
【AI大模型】ChatGPT模型原理介绍(下)
人工智能·python·深度学习·机器学习·自然语言处理·chatgpt
FreakStudio3 小时前
全网最适合入门的面向对象编程教程:50 Python函数方法与接口-接口和抽象基类
python·嵌入式·面向对象·电子diy
redcocal4 小时前
地平线秋招
python·嵌入式硬件·算法·fpga开发·求职招聘
artificiali4 小时前
Anaconda配置pytorch的基本操作
人工智能·pytorch·python
RaidenQ5 小时前
2024.9.13 Python与图像处理新国大EE5731课程大作业,索贝尔算子计算边缘,高斯核模糊边缘,Haar小波计算边缘
图像处理·python·算法·课程设计
花生了什么树~.5 小时前
python基础知识(六)--字典遍历、公共运算符、公共方法、函数、变量分类、参数分类、拆包、引用
开发语言·python
Trouvaille ~5 小时前
【Python篇】深度探索NumPy(下篇):从科学计算到机器学习的高效实战技巧
图像处理·python·机器学习·numpy·信号处理·时间序列分析·科学计算
爆更小小刘5 小时前
Python基础语法(3)下
开发语言·python
哪 吒5 小时前
华为OD机试 - 第 K 个字母在原来字符串的索引(Python/JS/C/C++ 2024 E卷 100分)
javascript·python·华为od