返回顶部

上下文管理器

 
 1 class Open:
 2     def __init__(self,name):
 3         self.name = name
 4 
 5     def __enter__(self):
 6         print("触发enter")
 7 
 8     def __exit__(self, exc_type, exc_val, exc_tb):
 9         print(exc_tb,'\n',exc_val,'\n',exc_type)  #接收异常的三个参数
10         print("退出exit")
11 
12 with Open('a.txt') as f:
13     print("===========")
14     print("===========")
15     # print(dfasdklf)  
16     print("===========")
17     '''
18     输出:
19         触发enter
20         ===========
21         ===========
22         ===========
23         None 
24          None 
25          None
26         退出exit
27     '''

下面,让程序产生异常:

 1 class Open:
 2     def __init__(self,name):
 3         self.name = name
 4 
 5     def __enter__(self):
 6         print("触发enter")
 7 
 8     def __exit__(self, exc_type, exc_val, exc_tb):
 9         print(exc_tb,'\n',exc_val,'\n',exc_type)  #接收异常的三个参数
10         print("退出exit")
11 
12 with Open('a.txt') as f:
13     print("===========")
14     print("===========")
15     print(dfasdklf)
16     print("===========")
17     '''
18     输出:
19         触发enter
20         ===========
21         ===========   #总共两个,说明出现异常立即退出
22         <traceback object at 0x0000014E7651D0C8> 
23          name 'dfasdklf' is not defined 
24          <class 'NameError'>
25         退出exit
26     '''

 自定义用于打开文件的上下文管理器:

 1 class MyOpenClass:
 2     def __init__(self,name,mode):
 3         self.name= name
 4         self.mode= mode
 5     
 6     def __enter__(self):
 7         print("进入上下文管理器")
 8         if self.mode == 'r':
 9             self.f = open(self.name,self.mode)
10         else:
11             self.f= open(self.name,self.mode)
12         return self #重点,要将self, 它返回的就是as 后面的那个
13     
14     def __exit__(self, exc_type, exc_val, exc_tb):
15         self.f.close()
16         print("退出上下文管理器")
17     def read(self):
18         return self.f.read()
19     def write(self,s):
20         self.f.write(s)
21 if __name__ =="__main__":
22     with MyOpenClass("d:/test.txt",'r') as f1,MyOpenClass("d:/test02.txt",'w') as f2:
23         txt = f1.read() #从f1中读
24         print(txt)
25         f2.write(txt)  # 写到f2中去

 

posted @ 2019-08-06 22:28  Zcb0812  阅读(103)  评论(0编辑  收藏  举报