python上下文管理协议_Python3基础-上下文管理协议
一.上下文管理协议
操作文件对象的时候可以这样写
with open('a.txt','r+') asf:'代码块'
上述叫做上下文管理协议,即with语句,为了让对象兼容with语句,必须在这个对象的类中声明__enter__ 和__exit__方法
1、__enter__()会在with语句出现(实例化对象)时执行
2、__exit__()会在with语句的代码块执行完毕之后才会执行
classOpen:
def __init__(self,name,mode):
self.name=name
self.mode=mode
def __enter__(self): #在实例化打开文件即触发,在with时触发
print('执行enter')return self #return的self 会复制给f,相当于通过Open类实例化对象f
def __exit__(self, exc_type, exc_val, exc_tb): ##在with中的代码块执行完毕才会触发
print('执行exit')
with Open('a.txt','r+')as f: #会触发enter '执行__enter__',相当于--》f=Open('a.txt').__enter__()
print(f)
print(f.name)
print(f.mode)
print('='*10)"""执行结果
执行enter<__main__.open object at>a.txt
r+执行exit
=========="""
二.__exit__
__exit__()中有三个参数分别代表异常类型,异常值和追溯信息,执行了__exit__则表示with语句执行完毕
1、若 __exit__返回值return 不为True,则
1.1 若 with 语句中没有异常,则程序正常执行
1.2 若 with 语句中出现异常,则程序会执行到with中出错的语句并执行__exit__,然后程序终止,‘吐出’异常
classOpen:
def __init__(self,name,mode):
self.name=name
self.mode=mode
def __enter__(self): #在实例化打开文件即触发,在with时触发
print('执行enter')return self #return的self 会复制给f,相当于通过Open类实例化对象f
def __exit__(self, exc_type, exc_val, exc_tb): ##在with中的代码块执行完毕才会触发
print('执行exit')
print(exc_type)
print(exc_val)
print(exc_tb)
with Open('a.txt','r+')as f: #会触发enter '执行__enter__',相当于--》f=Open('a.txt').__enter__()
print(f)
print(f.age) ##因为f对象没有age属性,则出现异常,程序执行到该句时将异常传递给__exit__的三个参数,并结束程序执行,报错
print(f.name) #该行语句后面的语句都不会执行,包括with语句的以外的语句也不会执行
print(f.mode) #该行语句后面的语句都不会执行,包括with语句的以外的语句也不会执行print('='*10)
"""Traceback (most recent call last):
执行enter
File"D:/pyAuto/pythonDay/pythonbase/类/上下文管理协议.py", line 25, in
<__main__.open object at>print(f.age)
执行exit
AttributeError:'Open' object has no attribute 'age'
'Open' object has no attribute 'age'
2、若 __exit__返回值return 为True,则
2.1 若 with 语句中没有异常,则程序正常执行
2.2 若 with 语句中出现异常,则程序会执行到with中出错的语句并执行__exit__,'吞掉'异常;然后with语句中剩下的语句不会执行,但是会继续执行with语句以外的语句
classOpen:
def __init__(self,name,mode):
self.name=name
self.mode=mode
def __enter__(self): #在实例化打开文件即触发,在with时触发
print('执行enter')return self #return的self 会复制给f,相当于通过Open类实例化对象f
def __exit__(self, exc_type, exc_val, exc_tb): ##在with中的代码块执行完毕才会触发
print('执行exit')
print(exc_type)
print(exc_val)
print(exc_tb)returnTrue #或者返回 return 1
with Open('a.txt','r+')as f: #会触发enter '执行__enter__',相当于--》f=Open('a.txt').__enter__()
print(f)
print(f.age) ##因为f对象没有age属性,则出现异常,程序执行到该句时将异常传递给__exit__的三个参数,并结束程序执行,报错
print(f.name) #该行语句后面的语句不会执行,但是with语句的以外的语句会执行
print(f.mode) #该行语句后面的语句不会执行,但是with语句的以外的语句会执行
print('='*10)"""执行enter<__main__.open object at>执行exit
'Open' object has no attribute 'age'
==========
"""
python上下文管理协议_Python3基础-上下文管理协议相关推荐
- python+pytest接口自动化-接口测试基础,http协议基础(一)
目录 前言: [文章末尾给大家留下了大量的福利] 接口定义 接口分类 常见接口 测试分层 测试左移和右移 总结 HTTP协议简介 HTTP协议特点 HTTP接口请求方法 HTTP与HTTPS区别[重点 ...
- python os获取文件大小_Python3基础 os.path.getsize 获得文件的大小
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda : 4.5.11 typesetting : Markdown ...
- python ctime源码_Python3基础 getatime getctime getmtime 文件的最近访问 + 属性修改 + 内容修改时间...
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda : 4.5.11 typesetting : Markdown ...
- python输出去空格_Python3基础 print(,end=) 输出内容的末尾加入空格
? ???????Python : 3.7.0 ?????????OS : Ubuntu 18.04.1 LTS ????????IDE : PyCharm 2018.2.4 ??????Conda ...
- python os读取文件名_Python3基础 os.path.splitext 处理文件名,得到文件名+扩展名
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda : 4.5.11 typesetting : Markdown ...
- python元组元素删除_Python3基础 通过拆分元素 把元组的数据删除
镇场诗: 诚听如来语,顿舍世间名与利.愿做地藏徒,广演是经阎浮提. 愿尽吾所学,成就一良心博客.愿诸后来人,重现智慧清净体. ------------------------------------- ...
- python获取字符串第一个字母_Python3基础 字符串 capitalize 返回一个新的字符串,它的第一个字母大写...
镇场诗: 诚听如来语,顿舍世间名与利.愿做地藏徒,广演是经阎浮提. 愿尽吾所学,成就一良心博客.愿诸后来人,重现智慧清净体. ------------------------------------- ...
- python的整除运算_Python3基础 ** 幂运算 // 整除运算
? ???? Python : 3.7.0 ?????? OS : Ubuntu 18.04.1 LTS ?????? IDE : PyCharm 2018.2.4 ????? Conda ...
- 如何查看python的工作目录_Python3基础 os listdir curdir查看当前工作目录的所有文件的名字...
? python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 conda : 4.5.11 type setting : Markdo ...
最新文章
- 【Python 】绘制惊艳的桑基图
- 解决Exception in thread “main“ org.apache.spark.SparkException: When running with master ‘yarn‘ either
- 容器(Collection/Map)、容器中的设计模式
- Swift之点击UITableView单元格动态改变cell高度
- android activity 被notification启动,Android通知Notification全面剖析
- php正则表达式程序,php正则表达式 Web程序 - 贪吃蛇学院-专业IT技术平台
- 新年干货 | NLP一路走来的经验之谈
- 手淘移动适配方案flexible.js兼容bug处理
- 最值得收藏的 人工智能导论 全部知识点思维导图整理(王万良慕课课程)
- 操作 神通数据库_神通大型通用数据库
- CTF密码学——常见编解码及加解密总结
- CVE-2021-1675 Windows Print Spooler权限提升漏洞复现
- 【自然语言处理】词性标注
- 坚果云 我的电脑图标_如何删除“我的坚果云”这个图标?
- 【硬件学习笔记】防反接保护电路
- 睡眠手环APP开发优势特点
- Java后台校验修改密码强度工具类
- 推荐一个小日本做的网站,超强震撼,创意绝对棒,真牛
- python识别图片中数字_Python实现识别图片上的数字
- 网络摄像机·监控摄像机 镜头驱动芯片 MS41909
热门文章
- java spring源码_spring源码分析-spring中的bean
- android平台代号、版本、API 级别和 NDK 版本
- 基于JAVA+SpringMVC+Mybatis+MYSQL的网上试衣间设计
- c# xls 复制一行_c# – 将excel工作簿中的第一行复制到新的Excel工作簿
- linux连接oracle数据库中文显示乱码
- Java使用HTTPClient4.3开发的公众平台消息模板的推送功能
- BZOJ 4143 The Lawyer
- ssh: Could not resolve hostname gitcafe.com: nodename nor servname provided, or not known
- Windows Phone 7 立体旋转动画的实现
- 不同公式等号对齐_数学公式编辑器“制作amp;套用公式模板”和“文本对齐问题”的完美解决方案...