Python进阶-----上下文管理协议(__enter__,__exit)

一、上下文管理协议
  即with语句,为了让一个对象兼容with语句,必须在这个对象的类中声明__enter__和__exit__方法
  1、__enter__()会在with语句出现(实例化对象)时执行
  2、__exit__()会在with语句的代码块实行完毕才会执行

 1 class Open:
 2     def __init__(self,name):
 3         self.name = name
 4
 5     def __enter__(self):                        #在实例化打开文件时即触发,在with时触发
 6         print(‘执行__enter__‘)
 7         return self                                #return的self会赋值给f,相当于通过Open类实例化处对象f
 8
 9     def __exit__(self,exc_type,exc_val,exc_tb):    #在with中的代码块执行完毕才会触发
10         print(‘执行__exit__‘)
11
12 with Open(‘a.txt‘) as f:                        #会触发enter  ‘执行__enter__‘,相当于--》f=Open(‘a.txt‘).__enter__()
13     print(f)                                    #<__main__.Open object at 0x01477270>
14     print(f.name)                                #‘a.txt‘
15 print(‘*‘*10)                                    #先---‘执行__exit__‘
16                                                 #后---‘*********‘   

二、__exit__
  __exit__()中有三个参数分别代表异常类型,异常值和追溯信息,执行了__exit__则表示with语句执行完毕
  1、若__exit__返回值不为True,则:
    a、若with语句中没有异常,则程序正常执行
    b、若with语句中出现异常,则程序会执行到with中出错的语句并执行__exit__,然后程序终止,‘吐出’异常

 1 class Open:
 2     def __init__(self,name):
 3         self.name = name
 4
 5     def __enter__(self):
 6         print(‘执行__enter__‘)
 7         return self
 8
 9     def __exit__(self,exc_type,exc_val,exc_tb):
10         print(‘执行__exit__‘)
11         print(exc_type)                #<class ‘AttributeError‘>
12         print(exc_val)                #‘Open‘ object has no attribute ‘age‘
13         print(exc_tb)                #<traceback object at 0x0178F738>
14
15 with Open(‘a.txt‘) as f:
16     print(f)
17     print(f.age)        #因为f对象没有age属性,则出现异常,程序执行到该句时将异常传递给__exit__的三个参数,并结束程序执行,报错
18     print(f.name)        #该行语句后面的语句都不会执行,包括with语句的以外的语句也不会执行
19 print(‘*‘*10)    

  2、若__exit__返回值为True,则:
    a、若with语句中没有异常,则程序正常执行
    b、若with语句中出现异常,则程序会执行到with中出错的语句并执行__exit__,‘吞掉’异常。然后with语句中剩下的语句不会执行,但是会继续执行with语句以外的语句

 1 class Open:
 2     def __init__(self,name):
 3         self.name = name
 4
 5     def __enter__(self):
 6         print(‘执行__enter__‘)
 7         return self
 8
 9     def __exit__(self,exc_type,exc_val,exc_tb):
10         print(‘执行__exit__‘)
11         print(exc_type)                #<class ‘AttributeError‘>
12         print(exc_val)                #‘Open‘ object has no attribute ‘age‘
13         print(exc_tb)                #<traceback object at 0x0178F738>
14         return True
15 with Open(‘a.txt‘) as f:
16     print(f)
17     print(f.age)        #因为f对象没有age属性,则出现异常,程序执行到该句时将异常传递给__exit__的三个参数,并结束程序执行,‘吞掉异常‘不会报错
18     print(f.name)        #该行语句后面的with中的语句都不会执行,但是with语句的以外的语句会继续执行
19 print(‘*‘*10)            #‘*********‘

三、作用及好处:
  1.使用with语句的目的就是把代码块放入with中执行,with结束后,自动完成清理工作,无须手动干预
  2.在需要管理一些资源比如文件,网络连接和锁的编程环境中,可以在__exit__中定制自动释放资源的机制,你无须再去关系这个问题,这将大有用处

原文地址:https://www.cnblogs.com/Meanwey/p/9898673.html

时间: 2024-10-01 23:55:59

Python进阶-----上下文管理协议(__enter__,__exit)的相关文章

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

所谓上下文管理协议,就是咱们打开文件时常用的一种方法:with __enter__(self):当with开始运行的时候触发此方法的运行 __exit__(self, exc_type, exc_val, exc_tb):当with运行结束之后触发此方法的运行 exc_type如果抛出异常,这里获取异常的类型 exc_val如果抛出异常,这里显示异常内容 exc_tb如果抛出异常,这里显示所在位置 代码示例:(以自己定义的Open类型做示例) 1 # 编辑者:闫龙 2 class Open: 3

关于__setitem__,__getitem__,delitem__以及__slots__,迭代器原理,上下文管理协议还有元类

关于__setitem__,__getitem__,delitem__ 类似于以前的学过的__setattr__,__getattr__... 不同之处在于item结尾的是用于对象以字典添加的形势添加,查看和删除属性的时候才会触发,如下例子: class Foo(object): # __slots__=['x','y'] def __setitem__(self, key, value): print('我在写入') self.__dict__[key]=value def __getitem

Python之上下文管理协议

一.上下文管理协议 <1>常规操作3步open: 1.f = open('a.txt') 2.对文件的操作 3.f.close() 上边两种操作 第二种操作因为打开文件之后必须关闭,不关闭占用内存的资源 而上下文管理协议就不会, 内存采用回收机制自动的去把对象清理掉 好处就是可以在exit方法中自动释放资源 <2>with with open('a.txt') as f: '代码块'上述就是上下文管理协议 __enter__ __exit__ 1 class Foo: 2 3 de

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

1.描述符 #!/usr/bin/python env # coding=utf-8 # 数据描述符__get__ __set__ __delete__ ''' 描述符总结 描述符是可以实现大部分python类特性中的底层魔法,包括@classmethod,@staticmethd,@property甚至是__slots__属性 描述符是很多高级库和框架的重要工具之一,描述符通常是使用到装饰器或者元类的大型框架中的一个组件 注意事项: 一 描述符本身应该定义成新式类,被代理的类也应该是新式类 二

Python基础- 类和对象(使用、继承、派生、组合、接口、多态、封装、property、staticmethod、classmethod、反射、slots、上下文管理协议、元类)

标签: python对象 2017-07-01 16:28 79人阅读 评论(0) 收藏 举报  分类: python(11)  版权声明:本文为广大朋友交流学习,如有纰漏望不吝赐教,若存在版权侵犯请及时与我联系 目录(?)[+] 一.初识类和对象 在python3中类型就是类 先定义类在产生相对应的对象,也就是现有了概念再有了实体 class Garen: camp = 'Demacia' def attack(self): print('attack') 1.如何使用类 在python3:

上下文管理协议with_open,__enter__和__exit__(三十八)

在操作文件对象的时候可以这么写 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("出现wit

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

with open('path', 'r' ,encoding='utf-8') as f: 代码块 上述就叫做上线文管理协议,即with语句,为了让一个对象兼容with语句,必须在这个对象的类中声明__enter__和__exit__方法. 上下文管理协议: class Open: def __init__(self,name): self.name=name def __enter__(self): print('出现with语句 ,对象的__enter__被触发,有返回值则赋值给as声明的

8.python之上下文管理协议

使用上下文管理协议,有什么好处? 使用with语句的目的就是把代码块放入with中执行,with结束后,自动完成清理工作,无须手动干预. 在需要管理一些资源比如文件,网络连接和锁的编程环境中,可以在__exit__中定制自动释放资源的机制,你无须再去关系这个问题,这将大有用处. 之前所提到的with代码块,就是python的上下文管理操作,比如说通过python打开一个文件,就可以通过with代码块结合open去实现,通过这种方式打开的文件,执行了相应的操作后,无需我们手动去close文件,文件

十六. 面向对象上下文管理协议

一. __enter__和__exit__ 我们知道在操作文件对象的时候可以这么写 1 with open('a.txt') as f: 2 '代码块' 上述叫做上下文管理协议,即with语句,为了让一个对象兼容with语句,必须在这个对象的类中声明__enter__和__exit__方法 # 上下文管理协议 class Open: def __init__(self,name): self.name=name def __enter__(self): print('出现with语句,对象的__