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('>>>>>>>>>>>>\n','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

posted @ 2019-09-15 21:09  小圣庄  阅读(144)  评论(0编辑  收藏  举报