第二十一讲 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")
相关推荐
float_六七19 分钟前
Python语言基础知识详解:分支结构控制语句
python
声声codeGrandMaster19 分钟前
django之优化分页功能(利用参数共存及封装来实现)
数据库·后端·python·django
Johny_Zhao43 分钟前
OpenStack 全套搭建部署指南(基于 Kolla-Ansible)
linux·python·信息安全·云计算·openstack·shell·yum源·系统运维
27669582921 小时前
海关 瑞数 后缀分析 rs
java·python·rs·瑞数·海关·瑞数后缀·后缀生成
学c真好玩1 小时前
Django创建的应用目录详细解释以及如何操作数据库自动创建表
后端·python·django
沐暖沐1 小时前
Django(快速上手版)
python·django
槑槑紫2 小时前
pytorch(gpu版本安装)
人工智能·pytorch·python
知识中的海王2 小时前
猿人学web端爬虫攻防大赛赛题第15题——备周则意怠-常见则不疑
爬虫·python
小白学大数据2 小时前
如何避免爬虫因Cookie过期导致登录失效
开发语言·爬虫·python·scrapy
测试老哥2 小时前
接口测试和功能测试详解
自动化测试·软件测试·python·功能测试·测试工具·测试用例·接口测试