zoukankan      html  css  js  c++  java
  • 上下文管理器

     
     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,'
    ',exc_val,'
    ',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,'
    ',exc_val,'
    ',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中去
  • 相关阅读:
    感知机学习笔记
    NOIP 模拟19
    NOIP 模拟17
    NOIP模拟14-16
    「动态规划」-数位dp专题
    8.5 NOIP 模拟测试 13
    8.3 NOIP 模拟12题解
    8.3 NOIP CE反思
    「分治」-cdq分治
    8.1 NOIP模拟11
  • 原文地址:https://www.cnblogs.com/zach0812/p/11312278.html
Copyright © 2011-2022 走看看