Python上下文管理协议 __enter__ 和 __exit__

Python with解析 __enter__()、__exit__() (十五) __enter__():在使用with语句时调用,会话管理器在代码块开始前调用,返回值与as后的参数绑定 __exit__():会话管理器在代码块执行完成好后调用,在with语句完成时,对象销毁之前调用 test.txt: Hello world! 测试代码 class Test(object): def __init__(self,name,flag): s 阅读详情

1.什么是上下文管理协议

上下文管理协议就是 with 语句, 为了让一个对象兼容with语句,必须在这个对象的类中声明__enter__()和__exit__()方法

  • with 对象,触发对象的__enter__的执行
  • 在with同一级别写代码, 脱离了with,就会执行 __exit__
class Open:
    def __enter__(self):
        print("----->enter执行了")
        return "enter的返回值"

    def __exit__(self, exc_type, exc_val, exc_tb):
        print("----->exit执行了")

with Open() as f:  # 触发 __enter__
    print(f)
print("---->结束")  # 触发 __exit__
'''
----->enter执行了
enter的返回值
----->exit执行了
----->结束
'''

2.exit 的三个参数

  • exc_type :异常类型
  • exc_val :异常信息
  • exc_tb :追溯信息

with语句中代码块出现异常,则with后的代码都无法执行

class Open:
    def __enter__(self):
        print("----->enter执行了")
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        print("异常类型--->",exc_type)
        print("异常信息--->",exc_val)
        print("追溯信息--->",exc_tb)
        print("----->exit执行了")

with Open() as f:
    print(f)
    raise AttributeError("这里设置一个异常,则下面代码不会再运行")

print("---->结束")  # 这一行无法运行

'''
----->enter执行了
<__main__.Open object at 0x0000022E31429D08>
异常类型---> <class 'AttributeError'>
异常信息---> 这里设置一个异常,则下面代码不会再运行
追溯信息---> <traceback object at 0x0000022E3142F0C8>
----->exit执行了
(抛出异常) : AttributeError: 这里设置一个异常,则下面代码不会再运行
'''

3.为什么要使用上下文管理器

可以自动的操作(创建/获取/释放)资源,如文件操作、数据库连接
无需在使用 try…execept… 去处理异常

如果__exit__()返回值为True,那么异常会被清空,就好像啥都没发生一样,with后的语句正常执行

class Open:
    def __enter__(self):
        print("----->enter执行了")
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        print("异常类型--->",exc_type)
        print("异常信息--->",exc_val)
        print("追溯信息--->",exc_tb)
        print("----->exit执行了")
        return True

with Open() as f:
    print(f)
    raise AttributeError("这里设置一个异常,但上面exit的return是True, 所以该异常被忽略")

print("---->结束")  # 这一行正常运行
#Python小白学习交流群:725638078
'''
----->enter执行了
<__main__.Open object at 0x000001D6CC399D08>
异常类型---> <class 'AttributeError'>
异常信息---> 这里设置一个异常,则下面代码不会再运行
追溯信息---> <traceback object at 0x000001D6CC39F0C8>
----->exit执行了
---->结束
Process finished with exit code 0
'''

4.自定义一个 open ,可以进行文件操作

class Open:
    def __init__(self,path,mode="rt",encoding="utf-8"):
        # 拿到一个open对象,那么我们就可以借用open对象的方法,当然你也可以重写方法read(),write()等
        self.f = open(path,mode,encoding=encoding)  

    def __enter__(self):
        return self.f  # 返回open对象 (作用就是为了可以使用它的方法)

    def __exit__(self, exc_type, exc_val, exc_tb):
        if exc_type:             # 如果不为空,说明with上下文内部出错误了
            print(exc_val)       # 打印一下错误信息
            print("错误已被忽略") # 提示一下不会结束程序
            return True          # return True 就是为了忽略错误
        self.f.close()           # 当with内部没有错误, 正常结束时进行资源清理工作(关闭文件等)

with Open("test.py","rt",encoding="utf-8") as f:
    res = f.read()
    print(res)
Python探索之旅:揭秘__enter__、__exit__与__slots__在类中的妙用 在本文中,我们详细探讨了 Python 中的__enter__,__exit__ 和 __slots__这三个特殊方法。 阅读详情

相关推荐

Python 上下文管理协议

操作文件对象时,我们一般采用下列方式: with open("a.txt",'w+',encoding = "utf-8) as f: '代码块'` 这种方法叫做上下文管理协议,即with语句,为了让一个对象兼容with语句,只需要在该对象所在的类中声明 enter 和 exit 方法 class Open: def __init__(self, name): ...

zhouyijun888的博客 703

Python之__enter__和__exit__

Python之__enter__和__exit__

tangsiqi130的博客 1501

使用Python的`exit`函数定义上下文管理器的退出操作

函数来定义上下文管理器的退出操作,我们可以在离开上下文时执行自定义的清理操作。函数是Python内置的一个函数,可以在定义上下文管理器时用于指定退出操作。在Python中,上下文管理器是一种用于管理资源的机制,它确保在使用资源后正确地释放它们。在上下文中执行一些操作后,离开上下文时会调用。方法中,我们可以执行任何我们希望在离开上下文时执行的操作。函数定义上下文管理器的退出操作,并提供相应的源代码示例。方法用于在进入上下文之前执行一些操作,而。方法用于在离开上下文时执行一些清理操作。的自定义上下文管理器。

BUG?不存在的! 283

Python----魔法函数__enter__/__exit__的用法

1、with上下文管理器的用法 with用的最多的可能就是打开文件,读写文件的场景,如下代码: with open("demo.txt","w+",encoding="utf8") as f: f.write("hello world") 其等同于如下代码: f=open("demo.txt","w+",encoding="utf8") f.write("hello world") f.close() 使用with语句的时候不需要显式的去关闭文件资源,因为它自动会关闭,那么这个自动关闭是怎么

redrose2100的博客 5660

使用QGIS提取天地图遥感影像中的建筑物轮廓,及AI方案

用QGIS的插件提取遥感影像中的建筑轮廓,并提供了几个AI提取建筑轮廓的方案。

cky_123的博客 2万+

2016域控服务器迁移,WIN Server2016 域服务器迁移出错

各位大神: 这几天刚安装了一台windows server 2016做域迁移时出现错误:1、默认SYSLOG、NETLOGON共享文件重启后自动取消共享,即使手动打开后依然会出现自动取消2、组策略中编辑策略时出现以下报错 policys.png (19.29 KB)2017-2-7 13:52操作此动作之前可以访问本机的共享(NETLOGON)3、使用DCDIAG检测多个报错:C:\Use...

weixin_31833039的博客 3313

python基础----实现上下文管理协议__enter__和__exit__

我们知道在操作文件对象的时候可以这么写 with open('a.txt') as f:   '代码块' 上述叫做上下文管理协议,即with语句,为了让一个对象兼容with语句,必须在这个对象的类中声明__enter__和__exit__方法 1 class Open: 2 def __init__(self,name): 3 ...

dejiong3425的博客 219

泛微Ecology流程数据表结构解析:workflow_requestbase和workflow_currentoperator到底怎么关联查询?

本文深入解析泛微Ecology系统中workflow_requestbase和workflow_currentoperator表的结构与关联机制,提供SQL查询语句示例,帮助开发者高效查询流程数据。涵盖待办事项、已办事项、办结事项和流程监控等典型场景,并分享性能优化技巧和常见问题排查指南。

weixin_33738555的博客 803

Python 上下文管理协议中的__enter__和__exit__基本理解

所谓上下文管理协议,就是咱们打开文件时常用的一种方法:with __enter__(self):当with开始运行的时候触发此方法的运行 __exit__(self, exc_type, exc_val, exc_tb):当with运行结束之后触发此方法的运行 exc_type如果抛出异常,这里获取异常的类型 exc_val如果抛出异常,这里显示异常内容 exc_tb如果...

weixin_34248118的博客 164

Windows Server安装Intel I219-V网卡驱动完整教程

在Windows Server系统上安装Intel I219-V网卡驱动的方法。

小白成长历程 5171

Mstar的Monitor方案OSD 菜单制作(五)——icon绘制

Mstar的Monitor方案(五)————绘制icon

android 系统定制开发那些事 1806

python语言使用什么语句实现上下文管理协议_python基础----实现上下文管理协议__enter__和__exit__...

我们知道在操作文件对象的时候可以这么写with open('a.txt') as f:'代码块'上述叫做上下文管理协议,即with语句,为了让一个对象兼容with语句,必须在这个对象的类中声明__enter__和__exit__方法1 classOpen:2 def __init__(self,name):3 self.name=name45 def __enter...

weixin_39672194的博客 403

ZYNQ 使用AXI_BRAM实现PS与PL 数据交互数据交互

有时CPU需要与PL进行小批量的数据交换,可以通过Block RAM实现。通过Zynq 的GP Master 接口读写PL端的 BRAM,实现PS与PL的交互。加入自定义的 FPGA 程序,并利用 AXI4 总线进行配置,通知何时读写 BRAM。CPU通过 AXI BRAM Controller 读取 BRAM 数据,CPU 仅配置自定义的 PL BRAM Controller 的寄存器,不通过它读写数将BRAM与socket进行联合使用,将电脑的数据发到PS端,PS端放在PL端,PL端再发给PS端,P据。

wangjie36的博客 1万+

Python概念-上下文管理协议中的__enter__和__exit__

所谓上下文管理协议,就是咱们打开文件时常用的一种方法:with __enter__(self):当with开始运行的时候触发此方法的运行 __exit__(self, exc_type, exc_val, exc_tb):当with运行结束之后触发此方法的运行 exc_type如果抛出异常,这里获取异常的类型  exc_val如果抛出异常,这里显示异常内容 exc_tb如果抛出异常,这里

enjoy leisure time 987

【图像超分】论文精读:Residual Dense Network for Image Super-Resolution(RDN)

一个非常深的卷积神经网络 (CNN) 最近在图像分类 (SR) 方面取得了巨大成功,并提供了分层特征。然而,大多数基于深度 CNN 的 SR 模型没有充分利用原始低分辨率 (LR) 图像中的层次特征,从而实现相对较低的性能。在本文中,我们提出了一种新的残差密集网络(RDN)来解决图像SR中的这个问题。我们充分利用所有卷积层的分层特征。具体来说,我们提出了残差密集块(RDB)通过密集连接的卷积层提取丰富的局部特征。RDB 进一步允许将前一个 RDB 的状态与当前 RDB 的所有层直接连接,从而产生连续的内存

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 7256

一文搞定离线环境下的RAG引擎部署

在人工智能浪潮下,技术已成为构建智能问答、文档分析和代码助手等应用的核心。然而,在许多企业场景中,出于数据安全和性能的考虑,服务器往往部署在中,并要求极致的推理效率。这给依赖外部资源的应用部署带来了巨大挑战。如何在这种严苛的环境下,完整、可靠地部署一套包含向量数据库、**高性能推理服务(vLLM)**和Python后台的复杂RAG系统呢?本文将为你提供一个,手把手教你如何使用 Docker 技术,将一套基于 Weaviate 和的 Python RAG 应用完整打包,并在离线环境中一键部署。

木鱼时刻的专栏 1241

Python上下文管理协议:__enter__和__exit__

上下文管理器(context manager)是Python2.5开始支持的一种语法,用于规定某个对象的使用范围。一旦进入或者离开该使用范围,会有特殊操作被调用 (比如为对象分配或者释放内存)。它的语法形式是with...as... 所谓上下文管理协议,就是咱们打开文件时常用的一种方法:with __enter__(self):当with开始运行的时候触发此方法的运行 __exit...

diansi2313的博客 222

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【Python】上下文管理协议__enter__和__exit__函数

原因是__exit__函数没有返回值,在没有返回值的情况下,with...as代码块执行失败后,代码块程序会中断,即剩余代码块程序不会被执行,直接执行__exit__函数,__exit__函数无返回值的情况下会将错误暴露出来,如上执行结果。with方法就是python的非常酷的语句,安全可靠,方便。说明在__exit__函数返回True时,执行with...as代码块发生异常时会包装异常,执行会中断当前with...as语句块,然后执行执行__exit__函数,最后with语句以外的代码。

smallbirdnq的专栏 1115

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

python中的上下文管理协议 __enter__ __exit__

所谓上下文管理协议,就是咱们打开文件时常用的一种方法:with __enter__(self):当with开始运行的时候触发此方法的运行 __exit__(self, exc_type, exc_val, exc_tb):当with运行结束之后触发此方法的运行 exc_type如果抛出异常,这里获取异常的类型 exc_val如果抛出异常,这里显示异常内容 exc_tb如果抛出异常,这里显示所在位置...

TH_NUM的博客 548

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

__enter__()、__exit__()实现上下文管理协议

打开函数open的本质也是一个工厂函数,所以它的运行也是实例化的过程,产生的对象就是文件句柄 f = open("a.txt") print(f.name) f.close() 为了可以实现 with open 的结构,需要定义__enter__()、_ exit_()来实现上下文管理协议,以实现以下结构: with open(“a.txt”) as f: “代码块” class Open: ...

weixin_43690603的博客 405

python之(__enter__和__exit__)

我们知道在操作文件对象的时候可以这么写 with open('a.txt') as f:   '代码块' 上述叫做上下文管理协议,即with语句,为了让一个对象兼容with语句,必须在这个对象的类中声明__enter__和__exit__方法 上下文管理协议 class Open: def __init__(self,name): self.name=name ...

Qiu先生的博客 9505

【Python】上下文管理器

上下文管理器是Python中用于管理资源(如文件、数据库连接、锁等)的机制,通过with语句简化资源获取和释放的代码。其核心原理是实现__enter__()和__exit__()方法:__enter__()在代码块执行前初始化资源,__exit__()确保无论是否发生异常都能正确释放资源。常见使用场景包括文件操作、数据库连接等,可以有效避免资源泄漏问题。自定义上下文管理器只需实现这两个方法,还能在__exit__()中处理特定异常。相比try-finally方式,上下文管理器使代码更简洁、安全。

m0_72516377的博客 1406

Python:with 语句与上下文管理协议

其核心思想是:代码块执行前先准备资源,执行后自动清理资源,无论期间是否发生异常。其内部会自动为每个资源调用各自的 __enter__() 和 __exit__() 方法,确保资源有序释放。1、__exit__() 接收三个参数用于异常处理:exc_type,exc_val,exc_tb。上下文管理器是实现了 __enter__ 和 __exit__ 方法的对象。(3)如果过程中抛出异常,自动调用 __exit__() 并传入异常信息。3、不推荐用 __del__() 做清理,时机不可控,无法保障异常安全。

qq_41176800的博客 1449

python语言使用什么语句实现上下文管理协议_python的上下文管理协议

上下文管理协议 with as 语句定义:上下文管理协议,即with语句,为了让一个对象兼容with语句,必须在这个对象的类中声明__enter__和__exit__方法enter(self)exit(self, exc_type, exc_val, exc_tb)enter:出现with语句,对象就会触发__enter__,其返回值会赋给as后的变量名exit:with代码执行结束后,会执行__...

weixin_39905037的博客 217

python上下文管理协议_Python3基础-上下文管理协议

一.上下文管理协议操作文件对象的时候可以这样写with open('a.txt','r+') asf:'代码块'上述叫做上下文管理协议,即with语句,为了让对象兼容with语句,必须在这个对象的类中声明__enter__ 和__exit__方法1、__enter__()会在with语句出现(实例化对象)时执行2、__exit__()会在with语句的代码块执行完毕之后才会执行classOpen:...

weixin_39981360的博客 208
上一篇: Python设置属性值方法setattr()和判断变量是否存在的方法
下一篇: Python类和对象的命名空间
Python程序u猿
博客等级 码龄5年 622粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值