在操作文件对象的时候可以这么写

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("出现with语句,对象的__enter__被触发,有返回值则赋值给as声明的变量")
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print("with中代码块执行完毕时执行") with Foo('a.txt') as f:
print("执行代码块.....")
print(f,f.name)
'''
出现with语句,对象的__enter__被触发,有返回值则赋值给as声明的变量
执行代码块.....
<__main__.Foo object at 0x0000022354BF4E48> a.txt
with中代码块执行完毕时执行
'''

__exit__()中的三个参数分别代表异常类型,异常值和追溯信息,with语句中代码块出现异常,则with后的代码都无法执行

class Foo:
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中代码块执行完毕时执行")
print(exc_type) # <class 'AttributeError'>
print(exc_val) # raise a error
print(exc_tb) # <traceback object at 0x00000255B7EBA208> with Foo('a.txt') as f:
print("执行代码块.....")
raise AttributeError("raise a error")
print('*'*10) # -----不会执行
print(''*10) # -----不会执行

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

class Foo:
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中代码块执行完毕时执行")
print(exc_type) # <class 'AttributeError'>
print(exc_val) # raise a error
print(exc_tb) # <traceback object at 0x00000255B7EBA208>
return True with Foo('a.txt') as f:
print("执行代码块.....")
raise AttributeError("raise a error")
print('*'*10) # -----不会执行
print(''*10)
'''
出现with语句,对象的__enter__被触发,有返回值则赋值给as声明的变量
执行代码块.....
with中代码块执行完毕时执行
<class 'AttributeError'>
raise a error
<traceback object at 0x000001293C15A248>
0000000000
'''

用途或者说好处:

1.使用with语句的目的就是把代码块放入with中执行,with结束后,自动完成清理工作,无须手动干预

2.在需要管理一些资源比如文件,网络连接和锁的编程环境中,可以在__exit__中定制自动释放资源的机制,你无须再去关系这个问题,这将大有用处

上下文管理协议with_open,__enter__和__exit__(三十八)的更多相关文章

  1. python - 上下文管理协议(with + __enter__ + __exit__)

    上下文管理协议: with + __enter__ + __exit__ #上下问管理协议: #with + __enter__ + __exit__ class Test(): def __init ...

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

    所谓上下文管理协议,就是咱们打开文件时常用的一种方法:with __enter__(self):当with开始运行的时候触发此方法的运行 __exit__(self, exc_type, exc_va ...

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

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

  4. __enter__,__exit__上下文管理协议

    上下文管理协议__enter__,__exit__ 用途或者说好处: 1.使用with语句的目的就是把代码块放入with中执行,with结束后,自动完成清理工作,无须手动干预 2.在需要管理一些资源比 ...

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

    所谓上下文管理协议,就是咱们打开文件时常用的一种方法:with __enter__(self):当with开始运行的时候触发此方法的运行 __exit__(self, exc_type, exc_va ...

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

    上下文管理器(context manager)是Python2.5开始支持的一种语法,用于规定某个对象的使用范围.一旦进入或者离开该使用范围,会有特殊操作被调用 (比如为对象分配或者释放内存).它的语 ...

  7. python 描述符 上下文管理协议 类装饰器 property metaclass

    1.描述符 #!/usr/bin/python env # coding=utf-8 # 数据描述符__get__ __set__ __delete__ ''' 描述符总结 描述符是可以实现大部分py ...

  8. 上下文管理协议with open as

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

  9. 用python优雅打开文件及上下文管理协议

    有次面试被问到如何优雅地打开一个文件?   那就是用with语句,调用过后可以自动关闭.   但是为什么使用with语句就可以自动关闭呢,原因就是上下文管理协议.   上下文管理协议:包含方法 __e ...

随机推荐

  1. 如何在《救赎之路》中使用CPU粒子效果

    Unreal游戏引擎4.19版本的发布,可以使得游戏可以更好地利用Intel多核心处理器的性能,以提供更精彩的游戏体验.这里以<救赎之路>这款优秀的国产独立游戏为例说明如何在游戏中使用CP ...

  2. python基础学习笔记(一)

    安装与运行交互式解释器 在绝大多数linux和 UNIX系统安装中(包括Mac OS X),Python的解释器就已经存在了.我们可以在提示符下输入python命令进行验证(作者环境ubuntu) f ...

  3. Record for Individual Project ( Word frequency program )

    1.  预计时间 ● 对问题总体的理解.规划:10 min ● 设计编写程序:5 h ● 调试: 分模块-40 min; 总体-40min ● 测试(性能分析).改进:1 h 2.  实际用时 ● 对 ...

  4. 个人阅读作业 --软件工程M1/M2总结

    软件工程M1/M2总结 写在前面的话: 这学期的软件工程伴着考期的展开逐渐落下帷幕,回顾这学期的软件工程,我感觉我的热情在一次又一次的失落中逐步消耗殆尽,每个人对于这门课的体验都会有所不同吧,可以确定 ...

  5. Scrum Meeting day 4

                第四次会议 No_00:工作情况 No_01:任务说明 待完成 已完成 No_10:燃尽图 No_11:照片记录 待更新 No_100:代码/文档签入记录 No_101:出席表 ...

  6. 《Linux内核设计与实现》 第十八章学习笔记

    调  试 一.准备开始 一个bug 一个藏匿bug的内核版本 相关内核代码的知识和运气 知道这个bug最早出现在哪个内核版本中. 1.想要成功进行调试: 让这些错误重现 抽象出问题 从代码中搜索 二. ...

  7. 结对项目gobang

    题目介绍:实现五子棋的基本规则,分黑棋和白棋.连成5个的胜利,完成了五子棋的单人游戏. 代码地址:https://github.com/liuxianchen/gobang 结对人:刘仙臣  康佳 结 ...

  8. windows、ubuntu、centos7下mysql 的安装与使用

    一.windows 及ubuntu下安装 windows可以傻瓜式安装,另一种空闲了下来写,也不麻烦 ubuntu: apt-get install mysql 强烈推荐使用ubuntu从这儿就很方便 ...

  9. Android动画总结

    本文总结常用属性方法等,详细学习可使用如下郭霖大神文章: Android属性动画完全解析(上),初识属性动画的基本用法 Android属性动画完全解析(中),ValueAnimator和ObjectA ...

  10. ubuntu查看本地ip

    1.下载net-tools sudo apt-get install net-tools 2.终端输入命令 ifconfig