当前位置: 首页 > news >正文

19_Python中的上下文管理器

在这里插入图片描述

Python中的上下文管理器

在Python中,上下文管理器(Context Manager)是一种用于资源管理的技术,它可以确保资源在使用后被正确释放,例如文件、网络连接或锁。

  • 上下文管理器(Context Manager)是指那些实现了__enter__和__exit__魔术方法的对象。这些方法允许Python在代码块执行前后自动执行特定的操作,如打开文件、创建数据库连接、获取锁等。
  • 使用with语句是管理上下文的一种方式,它可以自动处理资源的打开和关闭。

上下文管理器的作用

  • 资源管理:上下文管理器的主要作用是确保资源在使用后被正确地释放。资源可以是文件、网络连接、数据库连接、锁等。使用上下文管理器可以减少资源泄漏的风险,并简化资源管理的代码。
  • 简化代码:通过使用with语句,上下文管理器可以自动处理资源的设置和清理工作,而不需要开发者手动编写这些逻辑。这使得代码更加简洁、易读。
  • 异常处理:上下文管理器可以在资源使用过程中处理异常。如果在使用资源时发生异常,上下文管理器的__exit__方法可以捕获这些异常,并进行适当的清理工作,如关闭文件或释放锁,即使在发生错误的情况下也能保证资源被正确释放。
  • 维护上下文状态:上下文管理器可以用来设置和恢复某些上下文相关的状态,例如,更改和恢复全局变量的值,或者设置和取消线程局部存储。

上下文管理器的一些具体应用场景

  • 文件操作:使用open函数打开文件时,它会自动处理文件的打开和关闭,即使在文件操作中出现异常也能确保文件被关闭。
  • 数据库连接:使用数据库API时,上下文管理器可以确保数据库连接在操作完成后被关闭。
  • 线程同步:在多线程编程中,使用锁(Locks)或其他同步原语时,上下文管理器可以确保锁在临界区代码执行后被释放,即使发生异常也是如此。
  • 网络连接:管理网络连接时,上下文管理器可以确保连接在完成请求后被关闭。
# 导入os模块以使用os.path.exists函数
import os# 定义文件路径
file_path = 'example.txt'# 检查文件是否存在,如果不存在则创建并写入内容
if not os.path.exists(file_path):# 使用with语句和open函数以写入模式打开文件# with语句确保文件在操作完成后会被正确关闭with open(file_path, 'w') as file:# 写入一行文本到文件file.write('Hello, World!\n')# 在这里不需要手动关闭文件,因为with语句会自动处理# 如果文件已存在,则追加内容
else:# 使用with语句和open函数以追加模式打开文件with open(file_path, 'a') as file:# 追加一行文本到文件file.write('This is an appended line.\n')# 文件会在with语句块结束时自动关闭

在这个例子中,with语句被用来管理文件的打开和关闭。当with块结束时,文件会自动关闭,即使在写入过程中发生异常也是如此。这是上下文管理器的一个关键特性,它使得资源管理更加安全和简洁。

open() 函数中实现上下文管理器

用于文件操作。

# 打开文件并写入内容
with open('example.txt', 'w') as file:file.write('Hello, World!')# 打开文件并读取内容
with open('example.txt', 'r') as file:content = file.read()print(content)

sqlite3.connect() 函数中实现上下文管理器

它可以自动创建和关闭数据库连接。

import sqlite3# 连接到SQLite数据库
with sqlite3.connect('example.db') as connection:cursor = connection.cursor()cursor.execute('CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)')

threading.Lock() 函数中实现上下文管理器

它可以自动获取和释放锁。

import threading# 创建一个锁对象
lock = threading.Lock()# 使用锁确保线程安全
with lock:# 执行线程安全的操作print('Critical section')

自定义上下文管理器类

time.sleep() 函数不是一个上下文管理器,但它可以与with语句一起使用,以确保在等待时间后自动执行后续代码。

在这个例子中,sleep_context 类实现了上下文管理器协议,允许你使用 with 语句来等待指定的时间。当 with 代码块结束时,exit 方法会被调用,执行 time.sleep(self.seconds)。

import timeclass sleep_context:def __init__(self, seconds):self.seconds = secondsdef __enter__(self):# 在这里不需要做任何事情,因为我们将等待放在 __exit__ 方法中passdef __exit__(self, exc_type, exc_val, exc_tb):# 等待指定的时间time.sleep(self.seconds)# 返回 False 来确保任何在代码块中引发的异常都会被正常处理return False# 使用自定义的上下文管理器来等待3秒
with sleep_context(3):# 等待后继续执行print('Sleep is over')

附件

本文对应的jupyter notebook源码链接,欢迎下载练习:https://download.csdn.net/download/fx_yzjy101/89788897

如有问题请留言。


http://www.mrgr.cn/news/34634.html

相关文章:

  • 开源 2 + 1 链动模式、AI 智能名片、S2B2C 商城小程序在用户留存与品牌发展中的应用研究
  • Redis增删改查、复杂查询案例分析
  • Apache ECharts
  • dolphinscheduler
  • 【软考】系统架构设计师-计算机系统基础(2):操作系统
  • Visual Studio Code 端口转发功能详解
  • QT中添加资源文件(一看就会)
  • Linux常用命令
  • 开关频率与谐振频率对应的模态图
  • 一行命令,一分钟轻松搞定SSL证书自动续期
  • 类中的特殊内容
  • 华为高级交换技术笔记 2024-2025
  • 计算机组成原理==初识二进制运算
  • 研究生三年概括
  • Elasticsearch案例
  • Python中的“打开与关闭文件”:从入门到精通
  • X86架构(八)——32位处理器架构
  • 意得辑(Editage)润色全网最低折扣
  • JIT(Just-In-Time Compilation)编译器及其原理实现
  • 浮动静态路由
  • Java开发中那些可以提升性能/效率的小技巧(持续更新)
  • [leetcode刷题]面试经典150题之6轮转数字(简单)
  • 文件服务器FastDFS 消息队列中间件RabbitMQ
  • C++_23_STL容器
  • 孙子兵法及三十六计学习笔记
  • css如何设置间距