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.xdnf.cn/news/148242.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

GB28181语音对讲协议详解

GB28181-2016语音对讲流程如下图1所示: 图1.语音对讲流程。 其中, 信令 1 、2 、 3 、 4 为语音广播通知、 语音广播应答消息流程; 信令 5 、 1 2 、 1 3 、 1 4 、 1 5 、 1 6 为 S I P 服务器接收到客户端的呼叫请求通过 B 2 B UA 代理方式建立语音流接收者与媒…

计算机毕业设计之:基于微信小程序的电费缴费系统(源码+文档+讲解)

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

MatrixOne助力一道创新打造高性能智能制造AIOT系统

客户简介 深圳一道创新(ETAO Innovation)成立于2012年,是一家创新型软件及信息技术服务商,致力于制造戏份行业—电子制造业的数字转型服务,构建万物互联的智能工程。一道创新致力于把先进的软件系统、数字平台、人工智…

QT中添加资源文件

什么是资源文件 项目中经常需要添加图片、‌音频、‌视频、翻译文件等文件,在QT中,这些文件会放在 .qrc 文件中来被使用。 .qrc 文件是一个XML格式的资源集合描述文件,是Qt中用于定义和管理资源的关键文件 如何使用 创建资源文件 在你的Qt项…

C++之STL—string容器

本质:类 class 封装了很多方法:查找find,拷贝copy,删除delete 替换replace,插入insert 构造函数 赋值操作 assign: 字符串拼接 + append: string查找和替换 没查找到,po…

石头剪刀布手势识别系统源码分享

石头剪刀布手势识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comput…

Qt系统相关——QThread

文章目录 QThread的API使用示例客户端多线程应用场景互斥锁QMutexQMutexLockerQReadWriteLocker、QReadLocker、QWriteLocker 条件变量和信号量 QThread的API Qt中的多线程和Linux中的线程,本质上是一个东西 Linux线程概念 Linux多线程——线程控制 Linux多线程——…

[干货] [非基础警告] Unity 发布-订阅模式下的事件中心设计

本文师承于唐老师,但是修改了一些代码,采用更加方便理解的方式设计 1.什么是事件中心 2.可以比喻成冒险者工会的任务板子 任务板子上面有发布任务和任务完成两种基础情况 2.1 发布任务 来个冒险者发布一个任务,就执行Pulishtask方法 这…

记一次 RabbitMQ 消费者莫名消失问题的排查

问题回顾 某天下午,生产监控告警:消息积压,队列 xxx 消息数超过 100;我第一时间想到的是应用服务是不是停了,但应用服务存活监控又没有告警,但我还是找值班运维同事帮忙确认了下,确认结果是服务…

GitHub上图像超分开源项目推荐【持续更新】

RAISR 介绍:RAISR(Rapid and Accurate Image Super-Resolution)是一种由Google开发的图像超分辨率技术,它利用机器学习算法来提高低分辨率图像的质量,使其看起来更加清晰和细致。这项技术可以在移动设备上实时运行&am…

uni-app快速入门

目录 一、什么是 uni-app二、快速创建 uni-app 项目1.创建 uni-app2.运行 uni-app 三、uni-app 相对传统 H5 的变化1.网络模型的变化2.文件类型变化3.文件内代码架构的变化4.外部文件引用方式变化5.组件/标签的变化6.js的变化(1)运行环境从浏览器变成v8引…

java项目之基于springboot框架开发的景区民宿预约系统的设计与实现(源码+文档)

项目简介 基于springboot框架开发的景区民宿预约系统的设计与实现的主要使用者分为: 管理员的功能有:用户信息的查询管理,可以删除用户信息、修改用户信息、新增用户信息,根据公告信息进行新增、修改、查询操作等等。。 &#x1…

最新版Visual Studio安装教程(超详细,新手必看)

一、官网下载 这里奉上Visual Studio官方下载地址: https://visualstudio.microsoft.com/zh-hans/downloads/https://visualstudio.microsoft.com/zh-hans/downloads/ 对于我们学习来说,下载第一个社区免费版即可,点击下载。 下载完成以后是…

Conda虚拟环境配置常见问题记录

搞深度学习的,总有被虚拟环境搞得头大的时候,特别是涉及到CUDA,Torch ,Torchvision 版本适配的问题。这两天因为在原来的环境中装了几个包,导致原来的环境崩了,搞了一天的时间又重新配了环境,中…

18 基于51单片机的心率体温监测报警系统(包括程序、仿真、原理图、流程图)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机 ds18B20读取温度, 设置初始心率65 设置温度阈值38 心率阈值60 100 如果超过阈值,蜂鸣器报警,led灯亮 二、硬件资源 基于KEIL5编写C代码&#xf…

BOE(京东方)重磅亮相世界制造业大会 科技创新引领现代化产业体系建设新未来

9月20日-23日,备受瞩目的2024世界制造业大会在合肥盛大召开,汇聚全球行业领袖、专家学者、知名企业,共同探讨现代化产业体系建设的新技术、新趋势、新机遇。作为积极推动实体经济与数字经济融合发展的产业领军企业,BOE&#xff08…

文件(打开关闭读写) C语言

一、文件 二、打开文件 关闭文件 FILE *fopen(const char *path, const char *mode); 功能: 打开文件,获得对应的流指针数: "r" 只读方式,文件必须存在,不存在则报错 "r" 读写方式&…

spring boot文件上传之x-file-storage

spring boot文件上传之x-file-storage 今天看到一个文件上传的开源组件x-file-storage,官方地址如下: https://x-file-storage.xuyanwu.cn/#/ 该组件官网是这样介绍的,如下: 一行代码将文件存储到本地、FTP、SFTP、WebDAV、阿…

kettle从入门到精通 第八十六课 ETL之kettle kettle调用https接口忽略SSL校验

1、在使用kettle调用接口的时候不可避免要调用http或者https接口,调用http接口kettle可以正常工作,但是遇到https接口的时候kettle就会提示证书有误,无法正常调用接口,今天咱们一起通过自研插件的方式来解决这个问题。自研插件需要…

简单的云存储靶场

搭建靶场 我这里使用tx云,请自行搭建 https://shuihui2211-1329809954.cos.ap-nanjing.myqcloud.com 复现 私有读写 访问权限为私有读写时,我们访问url则会出现如下提示 目录遍历 漏洞成因 将policy权限设置为所有操作时 复现 我这里上传了一…