码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2018-11-02 23:43:18      阅读:222      评论:0      收藏:0      [点我收藏+]

标签:with open   自动完成   环境   上下   --   code   上下文   包括   err   

一、上下文管理协议
  即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__中定制自动释放资源的机制,你无须再去关系这个问题,这将大有用处

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

标签:with open   自动完成   环境   上下   --   code   上下文   包括   err   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!