python当中的with关键字

news/2024/12/19 19:48:55/文章来源:https://www.cnblogs.com/smartljy/p/18617835

python当中的with关键字

Python 中 with 关键字的作用

with 关键字在 Python 中用于 上下文管理。它简化了资源的 获取和释放,特别是文件操作、数据库连接或网络套接字等资源。使用 with 语句时,可以确保在执行代码块时,资源会得到适当的管理和清理,即使在出现异常的情况下,也能保证资源正确释放。

什么是上下文管理器?

上下文管理器是实现了上下文管理协议的对象,简单来说,它需要实现两个特殊方法:

  1. __enter__(self):当执行进入 with 语句块时调用。
  2. __exit__(self, exc_type, exc_value, traceback):当执行离开 with 语句块时调用,无论代码是否成功执行,或者是否抛出了异常。

示例 1:使用 with 打开文件

在 Python 中,最常见的 with 用法就是文件操作。通常在处理文件时,你需要手动打开和关闭文件,但这样很容易出错,特别是当出现异常时。使用 with 语句可以自动帮我们处理文件的打开和关闭。

# 示例:使用 `with` 打开文件
with open('example.txt', 'w') as f:f.write("Hello, World!")# 不需要显式调用 f.close(),因为退出 'with' 语句块时会自动关闭文件。

内部执行过程:

  • 进入上下文open('example.txt', 'w') 表达式创建一个文件对象,__enter__ 方法会被调用。
  • 退出上下文:当 with 语句块中的代码执行完毕(例如 f.write("Hello, World!")),__exit__ 方法会被调用,文件自动关闭。

示例 2:自定义上下文管理器

你也可以创建自己的上下文管理器,通过定义 __enter____exit__ 方法来实现资源的管理。

class MyContextManager:def __enter__(self):print("进入上下文")return selfdef __exit__(self, exc_type, exc_value, traceback):print("退出上下文")if exc_type:print(f"发生了异常: {exc_value}")# 使用示例
with MyContextManager() as cm:print("在上下文中执行")# 如果取消注释以下行,将引发异常,但退出块仍会执行# raise ValueError("哎呀!")# 输出:
# 进入上下文
# 在上下文中执行
# 退出上下文
# 发生了异常: 哎呀!

解释:

  1. __enter__:当进入 with 语句块时,__enter__ 方法会被调用,返回值会赋值给 as 后面的变量(在这个例子中是 cm)。
  2. __exit__:当 with 语句块执行完毕时,无论成功与否,__exit__ 方法都会被调用。如果发生了异常,它会在 __exit__ 方法中被处理或记录。

示例 3:用于线程锁定(并发编程)

在多线程编程中,with 语句也经常用于管理 ,确保同一时刻只有一个线程能够访问共享资源。Python 的 threading.Lock 类本身就实现了上下文管理协议。

import threadinglock = threading.Lock()def critical_section():with lock:print("进入临界区")# 在临界区执行任务print("退出临界区")# 模拟多个线程
threads = []
for _ in range(5):t = threading.Thread(target=critical_section)threads.append(t)t.start()for t in threads:t.join()

解释:

  • 当进入 with lock: 语句块时,锁会自动被获取。
  • 当退出该语句块时,锁会被自动释放,确保其他线程可以安全地访问共享资源。

总结:

  • with 用于将一段代码的执行包裹在上下文管理器定义的方法中。
  • 它确保 资源的自动获取和释放,即使在发生异常时,也能够正确地进行资源的清理。
  • 上下文管理器通过实现 __enter____exit__ 方法来管理资源,提供更简洁和安全的代码。
  • __enter____exit__ 方法定义了进入和退出 with 语句块时的行为。

在实际开发中,with 语句让我们能够 更简洁、安全、可读 地管理资源,尤其是那些需要显式释放的资源,如文件、网络连接或线程锁等。

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

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

相关文章

交换空间swap

交换空间: 交换空间是硬盘上的一部分,被用作虚拟内存,当系统的物理内存(RAM)不足时,系统会使用交换空间来存储暂时不用的数据。1.关闭交换空间 1)关闭所有交换空间 swapoff -a2)关闭特定的交换空间 swapoff /dev/sdb12.开启交换空间 1)开启所有交换空间 swapon -a2…

2024 IDEA 2024.3 安装使用教程(附激活至2099年,以及常见问题处理)

IntelliJ IDEA简介 IntelliJ IDEA是一款非常强大的Java集成开发环境(IDE),由JetBrains公司开发。它提供了丰富的功能和工具,帮助开发者更高效地编写、调试和部署代码。 下面这种方式仅供交流学习,如果有能力还请支持正版 下载安装 下载 IDEA 2024.3 版本的安装包 为了方便,也…

第十六次作业

1、通过华为云沃土云创计划免费薅云服务器 打开链接:https://developer.huaweicloud.com/programs/dev-program.html 使能⽅向选择个⼈在这个 计划权益中申请优惠券免费购买成功2、复现windows、linux权限维持技巧 windows权限维持: 隐藏⽂件:利⽤⽂件属性 ⽂件右键属性,勾…

OpenCL 编程步骤 2. 获取设备

clGetDeviceIDs 查询支持OpenCL设备列表: cl_int clGetDeviceIDs(cl_platform_id platform ,cl_device_type device_type ,cl_uint num_entries ,cl_device_id *devices ,cl_uint *num_devices )与clGetPlatformIDs函数类似,第一次调用时,devic…

记录一下:小华半导体HC32F448建立MDK工程

1.先到官网上下载文件 a>下载驱动库:HC32F448_DDL_Rev1.1.0.zip 驱动库中是包括了例程的。 b>下载样例:HC32F448_Template_Rev1.0.1.zip 可以直接复制官方的样例,就不用自己创建工程了。 c>下载芯片支持包:HC32F448_IDE_Rev1.0.1.zip 下载后双击安装即可。否则KEI…

4大应用场景揭秘:AI视频监控在养老院中的智能化管理与安全保障

随着人口老龄化的加剧,养老院的管理面临着越来越多的挑战。传统的人工巡查方式不仅难以做到全天候监控,而且存在响应迟缓、效率低下等问题。为了解决这些问题,思通数科推出的AI视频监控系统,利用人工智能技术提供了一种高效、智能化的解决方案。尤其在养老院的老人体征监控…

考勤管理系统

实现对用户信息的添加,查看,删除 实现对部门信息的添加,查看 实现用户登录功能,修改密码功能。 页面与之前的大相径庭。 还是一样的框架总体感觉换汤不换药,目前就是熟练度问题

浏览器怎么渲染数据的

突然发现自己对于css的样式规则一直都没有完全明白,今天写文好好整明白 浏览器渲染原理 1. 浏览器向服务器请求html文件 2. html文件返回浏览器 3. 浏览器解读html文件<!DOCTYPE html>//告诉浏览器,这是html5文件// html树<html lang="en">//语言<h…

在宝塔里添加反向代理

安装OnlyOffice时,需要配置反向代理; 完成以上操作之后,访问时有可能出现504报错,也可能就可以正常访问了。如果报错可以修改上图反向代理中的目标URL的内容将域名改成127.0.0.1。我当时改成http://127.0.0.1:9633就可以了本文来自博客园,作者:飞龙在生,转载请注明原文链…

2024 Clion安装使用教程(附激活以及常见问题处理)

第一步:下载Clion安装包 访问Clion官网,下载Clion第二步: 安装 Clion下载完成后,进行安装,next,安装完成点击xx 关掉程序! 第三步: 下载补丁 Clion补丁文件 点击获取补丁下载成功后,打开标注的文件文件夹 , 进入到文件夹 /jetbra 注意: 这个文件夹单独copy一份,所属文…

语言沟通中的设计实现

系统设计的目的是更好的支持需求 我们常说,只要业务能将你的需求描述清楚,能自圆其说,我们就有办法实现。 这其实是系统设计的最理想的状态, 如果业务没想清楚,那么在系统实现中,一定会把问题暴露出来。很多时候,问题的暴露源于没有考虑周全亦或都没有考虑这种场景! 比…