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

with open('a.txt',''r) as f:
代码

  上述叫做上下文管理协议,即with语句,为了让一个对象兼容with语句,必须在这个对象的类中声明__enter__和__exit__方法

  上下文管理协议.py

class Open:
def __init__(self,name):
self.name = name def __enter__(self):
print('执行enter')
return self def __exit__(self, exc_type, exc_val, exc_tb):
print('执行exit') #with触发的是__enter__
#返回的是self
with Open('a.txt') as f:
print('===>')
print('===>')
print('===>')
print(f)
print(f.name)
#执行完毕with会触发__exit__的运行

  正常是在with Open的时候执行__enter__然后执行with下面代码,如果执行代码没有出错exc_type, exc_val, exc_tb的值均为None

  假如在with下面执行出现错误则直接跳到__exit__并且不执行往下的代码

  上下文管理协议2.py

class Open:
def __init__(self,name):
self.name = name def __enter__(self):
print('执行enter')
return self def __exit__(self, exc_type, exc_val, exc_tb):
print('执行exit')
print('这是exc_type',exc_type)
print('这是exc_cal',exc_val)
print('这是exc_tb',exc_tb) #with触发的是__enter__
#返回的是self
with Open('a.txt') as f:
#f是self
print(f)
print(asdaddgdfg)
#打印出对应的属性
print(f.name)
#执行完毕with会触发__exit__的运行
print('0000000')

  exc_type, exc_val, exc_tb 三个参数分别对应异常类,异常值,异常追踪信息

  如果在__exit__返回一个True则不会报错而把对应的错误输出,不会执行with接着的语句print(f.name),但是会继续执行with下面的语句print('0000000')

lass Open:
def __init__(self,name):
self.name = name def __enter__(self):
print('执行enter')
return self def __exit__(self, exc_type, exc_val, exc_tb):
print('执行exit')
print('这是exc_type',exc_type)
print('这是exc_cal',exc_val)
print('这是exc_tb',exc_tb)
return True
#with触发的是__enter__
#返回的是self
with Open('a.txt') as f:
#f是self
print(f)
print(asdaddgdfg)
#打印出对应的属性
print(f.name)
#执行完毕with会触发__exit__的运行
print('0000000')

  输出如下没有报错(exit把异常吞掉了)

  PS:exit运行完毕,with也就结束了

  

  用途或者说好处:

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

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

  PS:python异常包含3部分

Python全栈day28(上下文管理)的更多相关文章

  1. Python全栈day28(描述符应用)

    描述符的使用 python是弱类型语言,及参数的赋值没有类型限制,下面通过描述符机制来实现类型限制功能 描述符应用1.py class Typed: def __get__(self, instanc ...

  2. Python全栈day28(类的装饰器)

    类是一个对象也可以像函数一样加装饰器 类的装饰器.py def deco(obj): print('======',obj) obj.x=1 obj.y=2 obj.z=3 return obj # ...

  3. 老男孩Python全栈第2期+课件笔记【高清完整92天整套视频教程】

    点击了解更多Python课程>>> 老男孩Python全栈第2期+课件笔记[高清完整92天整套视频教程] 课程目录 ├─day01-python 全栈开发-基础篇 │ 01 pyth ...

  4. Python全栈

    Python基础 Python基础01 Hello World! Python基础02 基本数据类型 Python基础03 序列 Python基础04 运算 Python基础05 缩进和选择 Pyth ...

  5. Python全栈开发【面向对象】

    Python全栈开发[面向对象] 本节内容: 三大编程范式 面向对象设计与面向对象编程 类和对象 静态属性.类方法.静态方法 类组合 继承 多态 封装 三大编程范式 三大编程范式: 1.面向过程编程 ...

  6. python 全栈开发之路 day1

    python 全栈开发之路 day1   本节内容 计算机发展介绍 计算机硬件组成 计算机基本原理 计算机 计算机(computer)俗称电脑,是一种用于高速计算的电子计算机器,可以进行数值计算,又可 ...

  7. Python全栈【进程、线程】

    Python全栈[进程.线程] 本节内容: 进程 线程 协程 I/O多路复用 进程 1.进程就是一个程序在一个数据集上的一次动态执行过程,进程是资源分配的最小单元. 2.进程一般由程序.数据集.进程控 ...

  8. python全栈开发中级班全程笔记(第二模块、第四章)(常用模块导入)

    python全栈开发笔记第二模块 第四章 :常用模块(第二部分)     一.os 模块的 详解 1.os.getcwd()    :得到当前工作目录,即当前python解释器所在目录路径 impor ...

  9. 想成为Python全栈开发工程师必须掌握的技能

    什么是Python全栈工程师? 即从前端页面的实现,到后台代码的编写,再到数据库的管理,一人可以搞定一个公司网站的所有事情,真正实现全栈开发. 全栈只是个概念 也分很多种类 真正的全栈工程师涵盖了we ...

随机推荐

  1. 让HttpClient不要打印巨多的日志

    让HttpClient不要打印巨多的日志 log4j.logger.org.apache.commons.httpclient=DEBUG 參考http://hc.apache.org/httpcli ...

  2. SignalTap ii的使用

    1.实现原理 SignalTap II获取实时数据的原理是在工程中引入Megafunction中的ELA(Embedded Logic Analyzer),以预先设定的时钟采样实时数据,并存储于FPG ...

  3. mysql 从一个表中查询插入另一个表

    insert into dnt_userfields (uid,realname ) select uid,nickname from discuz.dnt_users where uid>72 ...

  4. GuozhongCrawler看准网爬虫动态切换IP漫爬虫

    有些关于URL去重的方面代码没有提供,须要自己去实现.主要这里提供思路 项目地址:http://git.oschina.net/woshidaniu/GuozhongCrawler/tree/mast ...

  5. Odoo 8.0 new API 之model 装饰

    model装饰器的作用是返回一个集合列表 应用举例: 定义columns langs = fields.Selection(string="Lang",selection=&quo ...

  6. jquery获取的html元素和document获取的元素的区别

    最近通过ocx做了一个视频插件,然后将插件放到html中(想知道的可以看一下) 因为我要操作这个插件,要播放,停止等,所以我需要获取这个元素,不出意外的,我就用jquery来获取,然后根本无法执行,然 ...

  7. TF和SD

    TF卡又称T-Flash卡,全名:TransFLash,又名:Micro SD SD卡(Secure Digital Memory Card,安全数码卡)

  8. 什么是Mybatis

    MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis .iB ...

  9. php -- 魔术方法 之 删除属性:__unset()

    属性重载:当访问一个不存在或者权限不够的属性的时候,能够触发一系列的魔术方法,就叫做属性重载 __unset():当删除一个不存在或者权限不够的属性的时候会自动触发 <?php //属性重载 c ...

  10. 【SPOJ】8222. Substrings(后缀自动机)

    http://www.spoj.com/problems/NSUBSTR/ 题意:给一个字符串S,令F(x)表示S的所有长度为x的子串中,出现次数的最大值.求F(1)..F(Length(S)) 这题 ...