十六. 面向对象上下文管理协议

一. __enter__和__exit__

我们知道在操作文件对象的时候可以这么写

1 with open(‘a.txt‘) as f:
2   ‘代码块‘
上述叫做上下文管理协议,即with语句,为了让一个对象兼容with语句,必须在这个对象的类中声明__enter__和__exit__方法

# 上下文管理协议
class Open:
    def __init__(self,name):
        self.name=name

    def __enter__(self):
        print(‘出现with语句,对象的__enter__被触发,有返回值则赋值给as声明的变量‘)
        return self
    def __exit__(self, exc_type, exc_val, exc_tb):
        print(‘with中代码块执行完毕时执行我啊‘)

with Open(‘a.txt‘) as f:
    print(‘执行代码块‘)
    print(f, f.name)
#  执行顺序
# 出现with语句,对象的__enter__被触发,有返回值则赋值给as声明的变量
# 执行代码块
# <__main__.Open object at 0x00000291C6EE8898> a.txt
# with中代码块执行完毕时执行我啊
如果__exit()返回值为True,那么异常会被清空,就好像啥都没发生一样,with后的语句正常执行

class Open:
    def __init__(self,name):
        self.name=name

    def __enter__(self):
        print(‘出现with语句,对象的__enter__被触发,有返回值则赋值给as声明的变量‘)

    def __exit__(self, exc_type, exc_val, exc_tb):
        print(‘with中代码块执行完毕时执行我啊‘)
        print(exc_type)
        print(exc_val)
        print(exc_tb)
        return True

with Open(‘a.txt‘) as f:
    print(‘=====>执行代码块‘)
    raise AttributeError(‘***着火啦,救火啊***‘)
print(‘0‘*100) #------------------------------->会执行
# 模拟Open

class Open:
    def __init__(self,filepath,mode=‘r‘,encoding=‘utf-8‘):
        self.filepath=filepath
        self.mode=mode
        self.encoding=encoding

    def __enter__(self):
        # print(‘enter‘)
        self.f=open(self.filepath,mode=self.mode,encoding=self.encoding)
        return self.f

    def __exit__(self, exc_type, exc_val, exc_tb):
        # print(‘exit‘)
        self.f.close()
        return True
    def __getattr__(self, item):
        print(item)
        return getattr(self.f,item)

with Open(‘aa‘,‘r‘) as f:
    print(f)
    print(   f.read())

    f.wasdf #抛出异常,交给__exit__处理

#
# 用途或者说好处:
#
# 1.使用with语句的目的就是把代码块放入with中执行,with结束后,自动完成清理工作,无须手动干预
#
# 2.在需要管理一些资源比如文件,网络连接和锁的编程环境中,可以在__exit__中定制自动释放资源的机制,你无须再去关系这个问题,这将大有用处

原文地址:https://www.cnblogs.com/Sup-to/p/11087342.html

时间: 2024-10-09 10:23:40

十六. 面向对象上下文管理协议的相关文章

python 面向对象编程 之 上下文管理协议

with open('path', 'r' ,encoding='utf-8') as f: 代码块 上述就叫做上线文管理协议,即with语句,为了让一个对象兼容with语句,必须在这个对象的类中声明__enter__和__exit__方法. 上下文管理协议: class Open: def __init__(self,name): self.name=name def __enter__(self): print('出现with语句 ,对象的__enter__被触发,有返回值则赋值给as声明的

上下文管理协议with_open,__enter__和__exit__(三十八)

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

十六、变更管理; 十七、信息系统安全管理; 十八、项目风险管理

十六.变更管理 1.  变更的工作程序 (1).提出与接受变更申请 (2).对变更的初审 (3).变更方案论证 (4).项目变更控制委员会审查 (5).发出变更通知并开始实施 (6).变更实施的监控 (7).变更效果的评估 (8).判断发生变更后的项目是否已纳入正常轨道 2.  变更初审的4条内容 (1).对变更提出方施加影响,确认变更的必要性,确保变更是有价值的 (2).格式校验,完整性较验,确保评估所需信息准备充分 (3).在干系人间就提出供评估的变更信息达成共识 (4).变更初审的常见方式

Objective-C(十六、内存管理,自动释放池,ARC,强指针,弱指针,方法族)——iOS开发基础

结合之前的学习笔记以及参考<Objective-C编程全解(第三版)>,对Objective-C知识点进行梳理总结.知识点一直在变,只是作为参考,以苹果官方文档为准~ 十六.内存管理相关知识(二) 1.autorelease,自动释放机制 - (instancetype)autorelease; (1)自动释放池的创建 iOS5.0之前 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; //进行一系列操作 //此处不可以使用

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

所谓上下文管理协议,就是咱们打开文件时常用的一种方法:with __enter__(self):当with开始运行的时候触发此方法的运行 __exit__(self, exc_type, exc_val, exc_tb):当with运行结束之后触发此方法的运行 exc_type如果抛出异常,这里获取异常的类型 exc_val如果抛出异常,这里显示异常内容 exc_tb如果抛出异常,这里显示所在位置 代码示例:(以自己定义的Open类型做示例) 1 # 编辑者:闫龙 2 class Open: 3

Python基础- 类和对象(使用、继承、派生、组合、接口、多态、封装、property、staticmethod、classmethod、反射、slots、上下文管理协议、元类)

标签: python对象 2017-07-01 16:28 79人阅读 评论(0) 收藏 举报  分类: python(11)  版权声明:本文为广大朋友交流学习,如有纰漏望不吝赐教,若存在版权侵犯请及时与我联系 目录(?)[+] 一.初识类和对象 在python3中类型就是类 先定义类在产生相对应的对象,也就是现有了概念再有了实体 class Garen: camp = 'Demacia' def attack(self): print('attack') 1.如何使用类 在python3:

关于__setitem__,__getitem__,delitem__以及__slots__,迭代器原理,上下文管理协议还有元类

关于__setitem__,__getitem__,delitem__ 类似于以前的学过的__setattr__,__getattr__... 不同之处在于item结尾的是用于对象以字典添加的形势添加,查看和删除属性的时候才会触发,如下例子: class Foo(object): # __slots__=['x','y'] def __setitem__(self, key, value): print('我在写入') self.__dict__[key]=value def __getitem

linux基础-第十六单元 yum管理RPM包

第十六单元 yum管理RPM包 yum的功能 本地yum配置 光盘挂载和镜像挂载 本地yum配置 网络yum配置 网络yum配置 Yum命令的使用 使用yum安装软件 使用yum删除软件 安装组件 删除组件 清除缓存 查询 课后作业 [本节内容]1. yum的功能:yum是Yellow dog Updater, Modified的缩写,目的就是为了解决RPM的依赖关系的问题,方便使用者进行软件的安装.升级等等工作.2. 掌握光盘挂载和镜像挂载a) 光盘挂载mount /dev/sr0 挂载点或者

上下文管理协议

一.使用场景我们经常在进行文件操作时使用with语句来进行操作,这就关系到了上下文管理协议了.二.使用在使用with语句时,我们用到了enter()和exit()方法来进行文件的操作.如下图所示,我们可以自定义一个类似with功能的类来实现该功能.我们可以发现,with Open() as f,可以看做是,就行了一个实例化的过程,它是先执行,enter()方法,再执行with代码块,最后执行了exit()函数,接着才会执行with之后的代码块.问题1:with代码块中没有异常的情况没有异常的情况