上下文管理器

自定义上下文管理器
本文详细介绍了如何使用Python自定义上下文管理器,通过实现__enter__和__exit__方法来控制资源的获取和释放过程,展示了在with语句中如何处理异常,并提供了自定义文件操作类的实例。
 
 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中去

 

转载于:https://www.cnblogs.com/zach0812/p/11312278.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值