标签:with open 自动完成 环境 上下 -- code 上下文 包括 err
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 #后---‘*********‘
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)
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) #‘*********‘
Python进阶-----上下文管理协议(__enter__,__exit)
标签:with open 自动完成 环境 上下 -- code 上下文 包括 err
原文地址:https://www.cnblogs.com/Meanwey/p/9898673.html