第12天:上下文管理器

今日学习目标

  • 了解上下文管理器的基本概念和作用
  • 学习如何使用 with 语句
  • 学习如何创建自定义上下文管理器
  • 理解上下文管理器的实际应用场景

1. 上下文管理器简介

上下文管理器是一种用于管理资源的机制,它可以在一段代码执行前后自动执行一些操作。最常见的上下文管理器是文件操作和数据库连接。

2. 使用 with 语句

基本用法

with 语句用于包装代码块,确保在代码块执行前后自动执行预定义的操作。

with open('example.txt', 'w') as file:file.write('Hello, world!')
解释
  • open('example.txt', 'w'):打开文件 example.txt 进行写操作。
  • as file:将打开的文件对象赋值给变量 file
  • with 语句块中,执行 file.write('Hello, world!')
  • 代码块执行完毕后,文件自动关闭。

3. 自定义上下文管理器

使用类实现

自定义上下文管理器需要实现两个方法:__enter____exit__

class MyContextManager:def __enter__(self):print("Entering the context")return selfdef __exit__(self, exc_type, exc_value, traceback):print("Exiting the context")with MyContextManager():print("Inside the context")
解释
  • __enter__(self):进入上下文时执行的代码。
  • __exit__(self, exc_type, exc_value, traceback):退出上下文时执行的代码,处理异常。
输出
Entering the context
Inside the context
Exiting the context

4. 使用 contextlib 模块

contextlib 提供了更简单的方式来创建上下文管理器,尤其是基于生成器的上下文管理器。
使用 contextlib.contextmanager
from contextlib import contextmanager@contextmanager
def my_context_manager():print("Entering the context")yieldprint("Exiting the context")with my_context_manager():print("Inside the context")
解释
  • @contextmanager:装饰器,用于将生成器函数转换为上下文管理器。
  • yield:分隔上下文管理器的进入和退出部分。
输出
Entering the context
Inside the context
Exiting the context

5. 实际应用场景

文件操作
with open('example.txt', 'w') as file:file.write('Hello, world!')
数据库连接
import sqlite3with sqlite3.connect('example.db') as conn:cursor = conn.cursor()cursor.execute('CREATE TABLE IF NOT EXISTS example (id INTEGER PRIMARY KEY, name TEXT)')
from threading import Locklock = Lock()
with lock:# Critical section of codepass

自定义上下文管理器详细示例

使用类实现
class ManagedFile:def __init__(self, filename):self.filename = filenamedef __enter__(self):self.file = open(self.filename, 'w')return self.filedef __exit__(self, exc_type, exc_value, traceback):if self.file:self.file.close()with ManagedFile('example.txt') as f:f.write('Hello, world!')
解释
  • __enter__ 方法打开文件并返回文件对象。
  • __exit__ 方法关闭文件。

使用 contextlib 模块详细示例

from contextlib import contextmanager@contextmanager
def managed_file(filename):try:f = open(filename, 'w')yield ffinally:f.close()with managed_file('example.txt') as f:f.write('Hello, world!')
解释
  • @contextmanager 装饰器将生成器函数 managed_file 转换为上下文管理器。
  • yield 分隔上下文管理器的进入和退出部分,确保文件在退出时关闭。

总结

  1. 上下文管理器简介:上下文管理器用于管理资源,确保资源在使用完毕后正确释放。
  2. 使用 with 语句with 语句用于包装代码块,确保在代码块执行前后自动执行预定义的操作。
  3. 自定义上下文管理器:自定义上下文管理器需要实现 __enter____exit__ 方法。
  4. 使用 contextlib 模块contextlib 提供了基于生成器的上下文管理器,更加简洁。
  5. 实际应用场景:上下文管理器广泛应用于文件操作、数据库连接和锁等场景。

通过理解和掌握上下文管理器的基本概念和用法,可以更好地管理资源,确保代码的健壮性和可维护性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/39941.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QAM MMA

MMA是改进的CMA,有RCA和CMA的优点,还能对相位误差进行修正。 N 5e5; % 仿真符号数 M 16; % QAM16msg randi([0 M-1],N,1); % 产生随机符号 tx qammod(msg,M); % QAM调制test_snr 20:5:30; …

无畏契约/valorant匹配无反应、无法联机、联机报错的解决办法

无畏契约/valorant是一款热度超高的战术射击游戏,通过其独特的美漫英雄设计和丰富的战术性,以及武器技能设计系统,在全球吸引了不少玩家的加入和喜爱。不过近期伴随第九赛季更新,很多玩家重回服务器,却遇到了匹配无反应…

进程和内存管理 如何检查内存和CPU 内存的使用和剩余情况,当前CPU的负载情况,找进程id,结束某个进程

一、检查内存 方法一:查看/proc/meminfo文件,又被称为伪文件,记录了内存的相关信息,不可用vi/vim打开编辑,可用cat等命令查看。 方法二:free -m 命令 以MB为单位来显示内存情况。 二、检查CPU 方法一…

基于用户的协同过滤算法

目录 原理: 计算相似度: 步骤: 计算方法:Jaccard相似系数、余弦相似度。 推荐 原理: 先“找到相似用户”,再“找到他们喜欢的物品”--->人以群分。即,给用户推荐“和他兴趣相似的其他用…

C语言 输出*的图案(1,3,5,7,5,3,1顺序)

输出以下图案&#xff08;不是直接输出&#xff0c;且要求输出时符号居中对齐&#xff09;。 * *** ***** ******* ***** *** * 这个程序输出一个特定的图案&#xff0c;符号居中对齐。 #include <stdio.h>int main() {int n 4; // 图案的中间行数// 输出上半部分for …

绝地求生PUBG服务器延迟太高 购买领取响应时间长怎么解决

绝地求生PUBG是一款特别热门的射击类吃鸡游戏&#xff0c;游戏还有多张地图可供玩家选择&#xff0c;玩家们需要乘坐飞机空投跳伞至不同的各个角落&#xff0c;赤手空拳寻找武器&#xff0c;车辆以及物资&#xff0c;并在多种多样的地形中展开战斗。想要取得胜利&#xff0c;我…

分享一款可编辑本地电脑文件的在线编辑器

背景 之前见过在线版的VSCode&#xff0c;被惊讶到了。网页上竟然可以编辑电脑本地的文件&#xff0c;打破了网页无法编辑本地电脑文件的限制。一直好奇怎么做的。抽空研究了一下&#xff0c;然后发现其实也不难。 分析 先给大家介绍一下这款在线编辑器的效果。 左侧栏为文件…

彻底解决网络哈希冲突,百度百舸的高性能网络 HPN 落地实践

GPU 的通信性能对于大模型的训练有着至关重要的影响。在 HPN 网络工程实践中&#xff0c;我们的核心关注点是如何充分利用网络硬件资源的能力&#xff0c;将通信性能最大化&#xff0c;从而提升大模型端到端的训练性能。 1 HPN 网络 — AIPod 下图是百度百舸的高性能网络 …

Vue如何使用封装接口

在Vue项目中封装接口&#xff08;API&#xff09;是一个常见的需求&#xff0c;特别是在与后端服务进行交互时。封装接口的目的是为了将请求逻辑与组件逻辑分离&#xff0c;提高代码的可维护性和复用性。以下是一个简单的步骤和示例&#xff0c;说明如何在Vue项目中封装接口。 …

洛谷 P1020 [NOIP1999 提高组] 导弹拦截

题目描述 某国为了防御敌国的导弹袭击&#xff0c;发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷&#xff1a;虽然它的第一发炮弹能够到达任意的高度&#xff0c;但是以后每一发炮弹都不能高于前一发的高度。某天&#xff0c;雷达捕捉到敌国的导弹来袭。由于该系统…

下拉菜单显示年份选项(月份也适用)

项目场景&#xff1a; 下拉菜单显示年份选项&#xff08;月份也适用&#xff09; 前段语言Vue 问题描述 在列表的搜索栏常常需要提供年份、月份选择&#xff0c;此文记录一种简单的年份下拉菜单的展示方式&#xff1a; <el-form-item label"年份" prop"yea…

战略资讯 | TapData 牵手思想科技,开启数据管理新篇章!

在这个数字化飞速发展的时代&#xff0c;数据已成为企业最宝贵的资产之一。为了更好地迎接新时代的诉求与挑战&#xff0c;TapData 现已与思想科技达成了一项具有里程碑意义的战略合作协议。这不仅是两个企业之间的合作&#xff0c;更是对整个数据管理行业的一次重大推动。 思…

兴业严选|北京市户籍 多子女家庭买二套房个贷算首套

6月26日&#xff0c;北京市住房和城乡建设委员会、中国人民银行北京市分行、国家金融监督管理总局北京监管局、北京住房公积金管理中心联合印发《关于优化本市房地产市场平稳健康发展政策措施的通知》。 明确支持多子女家庭改善性住房需求&#xff0c;对北京市户籍二孩及以上的…

ode45的例程|MATLAB例程|四阶龙格库塔定步长节微分方程

ode45自己编的程序和测试代码 模型 模拟一个卫星绕大行星飞行的轨迹计算。 结果 轨迹图如下: 源代码 以下代码复制到MATLAB上即可运行,并得到上面的图像: % ode45自己编的程序和测试代码 % Evand©2024 % 2024-7-2/Ver1 clear;clc;close all; rng(0); % 参数设定…

C++Primer Plus 第十四章代码重用:编程练习,第5题

CPrimer Plus 第十四章代码重用&#xff1a;编程练习,第5题 CPrimer Plus 第十四章代码重用&#xff1a;编程练习,第5题 文章目录 CPrimer Plus 第十四章代码重用&#xff1a;编程练习,第5题前言5. 一、方法二、解答 前言 5. 下面是一些类声明: //emp.h--header file for ab…

OpenSSL EVP详解

OpenSSL EVP详解 Chapter1 OpenSSL EVP详解一、EVP基本介绍1. EVP 加密和解密2. EVP 签名和验证3. EVP 加解密文件 二、源码结构2.1 全局函数2.2 BIO扩充2.3 摘要算法EVP封装2.4 对称算法EVP封装2.5 非对称算法EVP封装2.6 基于口令的加密 三、开发实例3.1 示例13.2 示例23.3 示…

【MySQL】数据库——备份与恢复,日志管理

一、数据备份的重要性 1.备份的主要目的是灾难恢复 在生产环境中&#xff0c;数据的安全性至关重要 任何数据的丢失都可能产生严重的后果造成数据丢失的原因&#xff1a; 程序错误人为,操作错误运算错误磁盘故障灾难&#xff08;如火灾、地震&#xff09;和盗窃 2.数据库备份…

【5G射频基本架构】

平台框架 平台演进及搭配 5G NR频谱 NSA/SA/ENDC 在双连接中&#xff0c;UE在连接状态下可同时使用至少两个不同基站的无线资源。对于Sprint&#xff0c;ENDC将允许设备在相同的频段&#xff08;41 / 2.5 GHz频段&#xff09;上同时访问LTE和5G。 手机硬件实现ENDC方式—类似LT…

动态住宅代理IP的优势是什么?什么地方用到?

在大数据时代的背景下&#xff0c;代理IP成为了很多企业顺利开展的重要工具。代理IP地址可以分为住宅代理IP地址和数据中心代理IP地址。选择住宅代理IP的好处是可以实现真正的高匿名性&#xff0c;而使用数据中心代理IP可能会暴露自己使用代理的情况。 住宅代理IP是指互联网服务…

数据库系统概论 | 触发器代码 | 行级触发器 | 语句级触发器

触发器 这篇博客拿两个例子来解释一下什么是行级触发器和语句级触发器。 **例子1&#xff1a;**当对表SC的Grade属性进行修改时&#xff0c;若分数增加了10%&#xff0c;则将此次操作记录到另一个表SC_U&#xff08;Sno CHAR(8)、Cno CHAR(5)、Oldgrade SMALLINT、Newgrade S…