zoukankan      html  css  js  c++  java
  • __enter__ 和 __exit__上下文管理协议


    class F:
    def __init__(self,n):
    self.n = n

    def __enter__(self):
    print('执行enter')
    return self

    def __exit__(self, exc_type, exc_val, exc_tb):
    print('执行exit')
    print('exc_type-->',exc_type) #exc_type--> <class 'NameError'>
    print('exc_val-->',exc_val) #exc_val--> name 'xxxxxxxxxxxxxxxxxxxxxxxxx' is not defined
    print('exc_tb-->',exc_tb) #exc_tb--> <traceback object at 0x02EB25F8>
    return True #exc_type exc_val exc_tb;return True就是把上面这3个异常关闭了

    with F('a.txt') as f: #触发__enter__运行,并且返回了return self
    print(f) #<__main__.F object at 0x037FB4D0>,然后会接着运行__exit__
    print(xxxxxxxxxxxxxxxxxxxxxxxxx) #给个错误的打印 触发了__exit__,后面的代码不会运行了
    print('----------->')
    print('----------->')
    print('----------->')
    print('----------->')
    print('没有执行')
    总结:
      1 没有异常的情况下,整个代码块运行完毕后在触发__exit__,它的的三个值全部为none
      2 有异常的情况下面,从异常出现的位置直接触发__exit__
       a: 如果__exit__返回值为True,代表关闭异常
    b: 如果不为True,代表释放出异常
    c: __exit__运行完毕就代表整个with语句执行完毕

    用途或者说好处:

    1.使用with语句的目的就是把代码块放入with中执行,with结束后,自动完成清理工作,无须手动干预

    2.在需要管理一些资源比如文件,网络连接和锁的编程环境中,可以在__exit__中定制自动释放资源的机制,你无须再去关系这个问题,这将大有用处






  • 相关阅读:
    iphone的苹果式营销体会
    上海自驾游之水博园游记
    2011上海车展参观记(多图)
    一部烂电影《让子弹飞》
    坚持自己读罗永浩《我的奋斗》感悟
    转:心理测试
    我们只要世界第一
    一篇小学课文
    iphone 4 初体验
    Setting Expires and CacheControl: maxage headers for static resources in ASP.NET
  • 原文地址:https://www.cnblogs.com/ajaxa/p/9068936.html
Copyright © 2011-2022 走看看