第二十一讲 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")
相关推荐
梧桐树04292 小时前
python常用内建模块:collections
python
Dream_Snowar2 小时前
速通Python 第三节
开发语言·python
蓝天星空3 小时前
Python调用open ai接口
人工智能·python
jasmine s3 小时前
Pandas
开发语言·python
郭wes代码3 小时前
Cmd命令大全(万字详细版)
python·算法·小程序
leaf_leaves_leaf3 小时前
win11用一条命令给anaconda环境安装GPU版本pytorch,并检查是否为GPU版本
人工智能·pytorch·python
夜雨飘零13 小时前
基于Pytorch实现的说话人日志(说话人分离)
人工智能·pytorch·python·声纹识别·说话人分离·说话人日志
404NooFound4 小时前
Python轻量级NoSQL数据库TinyDB
开发语言·python·nosql
天天要nx4 小时前
D102【python 接口自动化学习】- pytest进阶之fixture用法
python·pytest
minstbe4 小时前
AI开发:使用支持向量机(SVM)进行文本情感分析训练 - Python
人工智能·python·支持向量机