第二十一讲 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")
相关推荐
南宫理的日知录10 分钟前
99、Python并发编程:多线程的问题、临界资源以及同步机制
开发语言·python·学习·编程学习
coberup19 分钟前
django Forbidden (403)错误解决方法
python·django·403错误
龙哥说跨境1 小时前
如何利用指纹浏览器爬虫绕过Cloudflare的防护?
服务器·网络·python·网络爬虫
小白学大数据1 小时前
正则表达式在Kotlin中的应用:提取图片链接
开发语言·python·selenium·正则表达式·kotlin
flashman9111 小时前
python在word中插入图片
python·microsoft·自动化·word
菜鸟的人工智能之路1 小时前
桑基图在医学数据分析中的更复杂应用示例
python·数据分析·健康医疗
懒大王爱吃狼2 小时前
Python教程:python枚举类定义和使用
开发语言·前端·javascript·python·python基础·python编程·python书籍
秃头佛爷3 小时前
Python学习大纲总结及注意事项
开发语言·python·学习
深度学习lover4 小时前
<项目代码>YOLOv8 苹果腐烂识别<目标检测>
人工智能·python·yolo·目标检测·计算机视觉·苹果腐烂识别
API快乐传递者5 小时前
淘宝反爬虫机制的主要手段有哪些?
爬虫·python