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

Python with语句

with 语句介绍:

python的with语句是一种用于简化资源管理的语法结构。

它主要用于确保在代码块执行完毕后,正确地释放资源,例如文件操作、锁、网络连接等。

with语句可以确保即使在发生异常的情况下,资源也能被正确地关闭和清理。

只要一个类实现了以下两个方法就可以使用with语句。

def __enter__(self):pass
def __exit__(self, exc_type, exc_value, traceback):pass

一般是上下文协议的对象或者资源管理器中使用with

实现了__enter____exit__都是上下文或者资源管理器。

常见的使用

with open('a.txt', 'r') as f:content = f.read()print(content)

使用open函数以只读模式 打开文件a.txtwith语句确保文件在操作完成后会被正确关闭,即使发生异常也是如此。文件的内容被读取到content变量中。打印出文件的内容。

显然这是没有营养的~


不知道我们没有思考过这么一个问题?上述代码中的f变量是一个什么是东西?

我在刚接触python的这个语法的时候,会认为f就是open()对象的返回值。后来发现是我肤浅了。

看下这段代码,自定义一个资源管理器类实现__enter____exit__

class MyResourceManager:def __enter__(self):print("Resource is being init...")a = 1print(a) # 1def __exit__(self, exc_type, exc_value, traceback):b = 2print(b) # 2print("Resource is being cleaned up.")with MyResourceManager() as resource:  # resource 不是上下文管理器,是__enter__方法的返回值print("Using the resource")print(type(resource))  # <class 'NoneType'>print(resource)        # Noneprint("Test End")

你会发现这里的resource是一个None, 按道理应该是MyResourceManager类型的。

直接说一下结果,with MyResourceManager() as resource这里的resourceMyResourceManager__enter__函数的返回值。大部分使用with好像都是前面对象本身的类型,那是因为__enter__函数返回了self对象本身。

with XX as resource 不是上下文或资源管理器对象,是enter方法的返回值

在看份代码,也许还会有发现~


class MyResourceManager:test_lst = ["a", "b", 12]def __enter__(self):print("Resource is being init...")print(self.test_lst) # ['a', 'b', 12]return selfdef __exit__(self, exc_type, exc_value, traceback):self.test_lst[2] = "c"print("Resource is being cleaned up")with MyResourceManager() as resource:print("Using the resource")print(type(resource))    # <class '__main__.MyResourceManager'>print(resource.test_lst) # ['a', 'b', 12]lst = resource.test_lst  # 取资源管理器里面的值 print(lst)               # ['a', 'b', 12]print(lst)                   # ['a', 'b', 'c']
print("Test End")

看到这里我想with语句就应该差不多了,为什么倒数第二行打印是['a', 'b', 'c']

with语句在进入时候会执行__enter__ 在离开的时候会执行__exit__
显然在上述代码中with结束的时候,对test_lst进行了修改,test_lst变量是一个对象,所以with结束的时候,外部lst的值会发生改变。

最后一个问题,如果上述代码test_lst改成intstrwith离开时修改test_lst,最后with外打印的lst值会变吗?
在线等你的答案~

相关文章:

  • 大数据运维学习笔记之flink standalone flink on yarn集群搭建 —— 筑梦之路
  • AI作画工具介绍
  • 容器是什么?
  • 【linux】(6)文本处理sed
  • 《软件定义安全》之一:SDN和NFV:下一代网络的变革
  • Python Flask实现蓝图Blueprint配置和模块渲染
  • 【Python报错】已解决FileNotFoundError: [Errno 2] No such file or directory: ‘xxx‘
  • Golang Context详解
  • 风能远程管理ARMxy嵌入式系统深度解析
  • 软件游戏steam_api.dll丢失的解决方法,总结5种有效的方法
  • Leetcode 3177. Find the Maximum Length of a Good Subsequence II
  • C# 共享内存
  • Linux操作系统:Zookeeper在虚拟环境下的安装与部署
  • 手撸一个java简易聊天室
  • 【UML用户指南】-13-对高级结构建模-包
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • 2017-09-12 前端日报
  • Cookie 在前端中的实践
  • Fabric架构演变之路
  • HTML中设置input等文本框为不可操作
  • leetcode386. Lexicographical Numbers
  • Spring Boot MyBatis配置多种数据库
  • vue 个人积累(使用工具,组件)
  • 深度学习入门:10门免费线上课程推荐
  • 使用 Xcode 的 Target 区分开发和生产环境
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (23)Linux的软硬连接
  • (4)事件处理——(7)简单事件(Simple events)
  • (7)svelte 教程: Props(属性)
  • (C语言)二分查找 超详细
  • (安卓)跳转应用市场APP详情页的方式
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (论文阅读40-45)图像描述1
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (循环依赖问题)学习spring的第九天
  • (原)Matlab的svmtrain和svmclassify
  • (转)JAVA中的堆栈
  • (转)原始图像数据和PDF中的图像数据
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .NET 表达式计算:Expression Evaluator
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)
  • .NET实现之(自动更新)
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • .NET中使用Protobuffer 实现序列化和反序列化
  • /3GB和/USERVA开关
  • :“Failed to access IIS metabase”解决方法
  • @property python知乎_Python3基础之:property
  • @ResponseBody
  • @开发者,一文搞懂什么是 C# 计时器!
  • [ Linux Audio 篇 ] 音频开发入门基础知识
  • [AI StoryDiffusion] 创造神奇故事,AI漫画大乱斗!
  • [Angularjs]asp.net mvc+angularjs+web api单页应用之CRUD操作
  • [C++11 多线程同步] --- 条件变量的那些坑【条件变量信号丢失和条件变量虚假唤醒(spurious wakeup)】
  • [CSS]中子元素在父元素中居中