zoukankan      html  css  js  c++  java
  • 2019年9月15日 上下文管理协议 __enter__ 和 __exit__

    复习with 与open:

    with open ('test2.txt') as f:#自动会关闭文件,不需要再写close
        print(f.readlines())
    
    g=open('test2.txt','r')
    print(g.readlines())
    g.close()

    with obj as f:#相当于 f=obj.__enter__() 

      ‘代码块’

    with obj >>>>>触发obj.__enter__(),拿到返回值。

    as f >>>>>> f=返回值

    执行代码块
      1.无异常,全部运行好后执行__exit__,三个参数为none
      2.有异常,从异常出现的位置触发__exit__
        2.a 如果__exit__的返回值为true,代表吞掉异常
        2.b 如果__exit__的返回值不会true,代表吐出异常
        2.c exit的运行完毕代表整个with语句执行完毕

    用途:
      1.用with语句把代码块放入with中执行,with结束后自动完成清理工作
      2.在需要管理一些资源的时候,比如文件,网络连接和锁的环境中,可以用__exit__中定制自动释放资源的机制

    class OpenX:
        def __init__(self,name):
            self.name=name
    
        def __enter__(self):
            print('do enter')
            return self# 触发enter返回self,并赋值给f
    
        def __exit__(self, exc_type, exc_val, exc_tb):
            print('do exit')
            print('exc_type异常的类:',exc_type)
            print('exc_val异常的内容',exc_val)
            print('exc_tb异常的追踪:',exc_tb)
            return True #通过返回True 解决抛出异常。
    
    with OpenX('test2.txt') as f:#确实是在实例化,但是不等同于在做实例化f=OpenX('test2.txt'),因为有with会触发enter,enter返回的值赋予给f
        print(f.__dict__)
        print('do with as f')
        print(xxx) #如果没有意外情况则反馈None,有意外则会触发exit,并且break跳出with运行
        print('这行不运行')
    
    print('>>>>>>>>>>>>
    ','exit是在open关闭时候才会触发,所以在这一行上面会有exit')

    》》》》》》》》》》》

    do enter
    {'name': 'test2.txt'}
    do with as f
    do exit
    exc_type异常的类: <class 'NameError'>
    exc_val异常的内容 name 'xxx' is not defined
    exc_tb异常的追踪: <traceback object at 0x10077f488>
    >>>>>>>>>>>>
    exit是在open关闭时候才会触发,所以在这一行上面会有exit

  • 相关阅读:
    Section 3.1 Shaping Regions
    3D@OpenSource
    查找资料
    Section 3.1 Shaping Regions Again
    USACO Contact IOI’98 TLE
    事项ON丰宁坝上草原
    四叉树@POJ1610 Quad Trees
    在TabCtrl上放View@MFC
    CUGB的一场周赛
    贴图程序进展
  • 原文地址:https://www.cnblogs.com/python1988/p/11524270.html
Copyright © 2011-2022 走看看