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中去
  • 相关阅读:
    MySQL服务器SSD性能问题分析与测试
    MySQL 5.7基于GTID复制的常见问题和修复步骤(一)
    用pt-stalk定位MySQL短暂的性能问题
    服务器IO瓶颈对MySQL性能的影响
    MySQL主从检验一致性工具pt-table-checksum报错的案例分析
    MySQL DROP DB或TABLE场景下借助SQL Thread快速应用binlog恢复方案
    MySQL服务器发生OOM的案例分析
    NUMA导致的MySQL服务器SWAP问题分析与解决方案
    python学习之-- 生成唯一ID
    python练习之-计算器
  • 原文地址:https://www.cnblogs.com/zach0812/p/11312278.html
Copyright © 2011-2022 走看看