一.上下文管理协议

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

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基础-上下文管理协议相关推荐

  1. python+pytest接口自动化-接口测试基础,http协议基础(一)

    目录 前言: [文章末尾给大家留下了大量的福利] 接口定义 接口分类 常见接口 测试分层 测试左移和右移 总结 HTTP协议简介 HTTP协议特点 HTTP接口请求方法 HTTP与HTTPS区别[重点 ...

  2. 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 ...

  3. 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 ...

  4. python输出去空格_Python3基础 print(,end=) 输出内容的末尾加入空格

    ? ???????Python : 3.7.0 ?????????OS : Ubuntu 18.04.1 LTS ????????IDE : PyCharm 2018.2.4 ??????Conda ...

  5. 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 ...

  6. python元组元素删除_Python3基础 通过拆分元素 把元组的数据删除

    镇场诗: 诚听如来语,顿舍世间名与利.愿做地藏徒,广演是经阎浮提. 愿尽吾所学,成就一良心博客.愿诸后来人,重现智慧清净体. ------------------------------------- ...

  7. python获取字符串第一个字母_Python3基础 字符串 capitalize 返回一个新的字符串,它的第一个字母大写...

    镇场诗: 诚听如来语,顿舍世间名与利.愿做地藏徒,广演是经阎浮提. 愿尽吾所学,成就一良心博客.愿诸后来人,重现智慧清净体. ------------------------------------- ...

  8. python的整除运算_Python3基础 ** 幂运算 // 整除运算

    ? ????   Python : 3.7.0 ??????   OS : Ubuntu 18.04.1 LTS ??????  IDE : PyCharm 2018.2.4 ????? Conda ...

  9. 如何查看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 ...

最新文章

  1. 【Python 】绘制惊艳的桑基图
  2. 解决Exception in thread “main“ org.apache.spark.SparkException: When running with master ‘yarn‘ either
  3. 容器(Collection/Map)、容器中的设计模式
  4. Swift之点击UITableView单元格动态改变cell高度
  5. android activity 被notification启动,Android通知Notification全面剖析
  6. php正则表达式程序,php正则表达式 Web程序 - 贪吃蛇学院-专业IT技术平台
  7. 新年干货 | NLP一路走来的经验之谈
  8. 手淘移动适配方案flexible.js兼容bug处理
  9. 最值得收藏的 人工智能导论 全部知识点思维导图整理(王万良慕课课程)
  10. 操作 神通数据库_神通大型通用数据库
  11. CTF密码学——常见编解码及加解密总结
  12. CVE-2021-1675 Windows Print Spooler权限提升漏洞复现
  13. 【自然语言处理】词性标注
  14. 坚果云 我的电脑图标_如何删除“我的坚果云”这个图标?
  15. 【硬件学习笔记】防反接保护电路
  16. 睡眠手环APP开发优势特点
  17. Java后台校验修改密码强度工具类
  18. 推荐一个小日本做的网站,超强震撼,创意绝对棒,真牛
  19. python识别图片中数字_Python实现识别图片上的数字
  20. 网络摄像机·监控摄像机 镜头驱动芯片 MS41909

热门文章

  1. java spring源码_spring源码分析-spring中的bean
  2. android平台代号、版本、API 级别和 NDK 版本
  3. 基于JAVA+SpringMVC+Mybatis+MYSQL的网上试衣间设计
  4. c# xls 复制一行_c# – 将excel工作簿中的第一行复制到新的Excel工作簿
  5. linux连接oracle数据库中文显示乱码
  6. Java使用HTTPClient4.3开发的公众平台消息模板的推送功能
  7. BZOJ 4143 The Lawyer
  8. ssh: Could not resolve hostname gitcafe.com: nodename nor servname provided, or not known
  9. Windows Phone 7 立体旋转动画的实现
  10. 不同公式等号对齐_数学公式编辑器“制作amp;套用公式模板”和“文本对齐问题”的完美解决方案...