一. __enter__和__exit__

我们知道在操作文件对象的时候可以这么写1 with open('a.txt') as f:
2   '代码块'

上述叫做上下文管理协议,即with语句,为了让一个对象兼容with语句,必须在这个对象的类中声明__enter__和__exit__方法# 上下文管理协议
class Open:def __init__(self,name):self.name=namedef __enter__(self):print('出现with语句,对象的__enter__被触发,有返回值则赋值给as声明的变量')return selfdef __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=namedef __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 Truewith Open('a.txt') as f:print('=====>执行代码块')raise AttributeError('***着火啦,救火啊***')
print('0'*100) #------------------------------->会执行

# 模拟Openclass Open:def __init__(self,filepath,mode='r',encoding='utf-8'):self.filepath=filepathself.mode=modeself.encoding=encodingdef __enter__(self):# print('enter')self.f=open(self.filepath,mode=self.mode,encoding=self.encoding)return self.fdef __exit__(self, exc_type, exc_val, exc_tb):# print('exit')
        self.f.close()return Truedef __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

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

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

    with open('path', 'r' ,encoding='utf-8') as f: 代码块 上述就叫做上线文管理协议,即with语句,为了让一个对象兼容with语句,必须在这个对象的类中声明 ...

  2. 【Linux命令】《鸟哥Linux基础》第十六章 进程管理与SELinux初探

    第十六章 进程管理与SELinux初探 16.1 什么是进程(process) Linux下的所有命令与你能够执行的操作 ===>都与权限有关 如何判断权限? 账号管理中的UID.GID:文件属 ...

  3. python3高级语法:__slots__属性、property装饰器、上下文管理协议、__new__方法

    #practice29:派生内置不可变类型并修改其实例化行为(以tuple为例) __new__() is intended mainly to allow subclasses of immutab ...

  4. python语言使用什么语句实现上下文管理协议_Python with语句上下文管理器两种实现方法分析...

    本文实例讲述了Python with语句上下文管理器.分享给大家供大家参考,具体如下: 在编程中会经常碰到这种情况:有一个特殊的语句块,在执行这个语句块之前需要先执行一些准备动作:当语句块执行完成后, ...

  5. python语言使用什么语句实现上下文管理协议_Python 上下文管理器

    上下文管理器 在使用Python编程中,可以会经常碰到这种情况:有一个特殊的语句块,在执行这个语句块之前需要先执行一些准备动作:当语句块执行完成后,需要继续执行一些收尾动作. 例如:当需要操作文件或数 ...

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

    第十六单元 yum管理RPM包 yum的功能 本地yum配置 光盘挂载和镜像挂载 本地yum配置 网络yum配置 网络yum配置 Yum命令的使用 使用yum安装软件 使用yum删除软件 安装组件 删 ...

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

    一.上下文管理协议 操作文件对象的时候可以这样写 with open('a.txt','r+') asf:'代码块' 上述叫做上下文管理协议,即with语句,为了让对象兼容with语句,必须在这个对象 ...

  8. python语言使用什么语句实现上下文管理协议_Python 技巧探究:上下文管理器和with语句...

    一:前言 Python 里面的 with 语句是被认为是晦涩难懂的特征之一,但是当你窥视它的内部你就会发现这里面并没有什么魔法.事实上它可以帮助我们写一些整洁和可读性高的代码. 那么 with 语句适 ...

  9. TCP/IP详解 卷1:协议 学习笔记 第十六章 BOOTP:引导程序协议

    一个无盘系统在不知道自身IP地址情况下,进行系统引导时能通过RARP协议获取它的IP地址,使用RARP会有两个问题:(1)IP地址是返回的唯一结果:(2)RARP使用链路层广播,RARP请求不会被路由 ...

最新文章

  1. 值得分享!最新发现了10个冷门好用软件,一眼就会爱上
  2. php 查看init,php 中init log
  3. C++手册_迅为干货 | C程序调用shell
  4. Web服务-Nginx网页服务
  5. 判断输入的日期字符串是否小于当前日期
  6. 马上就要到了的即时通讯
  7. 对职场橡皮人Say No(转)
  8. 一句代码错误,就要出差
  9. mysql事件查看器_MYSQL事件查看器使用介绍 | 学步园
  10. linux 挂载ntfs移动硬盘,centos6.5 挂载ntfs格式移动硬盘
  11. 微型计算机原理与接口技术(慕课版),微机原理与接口技术
  12. 闫令琪图形学入门笔记(光栅化篇)
  13. 笔记本打印时出现打印机出现异常配置问题_win10系统打印机出现administrator无法打印如何解决...
  14. 一、Windows系统下安装Tensorflow2.x(2.6)
  15. python 一张图画多条线_Python画多条线在一个图里
  16. 【工业机器人】关于工业机器人控制系统,这几方面内容你必须掌握;如何将工业机器人与数控机床融合应用?
  17. 设计模式真的能改善软件质量吗 (一)
  18. 串口通信之————IIC(软件驱动)
  19. 【转载】如何转载博客
  20. Pinterest:难以平衡的中间人角色 毫无创新的抄袭

热门文章

  1. java加法运算表达式_java运算符和表达式
  2. python画树干_python教你画一棵树
  3. Java异常:IllegalArgumentException Collections.sort报错
  4. jquery 如何插入元素
  5. 在win10系统下安装ubuntu17.10以及基本配置
  6. dingo php,Laravel+Dingo/Api 自定义响应的实现
  7. python进程socket通信_python3 进程间通信之socket.socketpair()
  8. linux配置usb主从_技术 | 手把手教你搭建MySQL主从架构
  9. c#生成token访问的接口_python测试开发django60.token登录(TokenAuthentication)
  10. Oracle系统表查询方法