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__中定制自动释放资源的机制,你无须再去关系这个问题,这将大有用处






  • 相关阅读:
    静态链接到 MFC 的规则 DLL
    DLLAFX_MANAGE_STATE(AfxGetStaticModuleState())模块状态切换保护
    多线程专题之线程同步(1)
    UVa 4256 Salesmen dp
    nefu 661 Clockwise 水DP+略几何
    10635 Prince and Princess LCS&LIS
    UVa 3882 And Then There Was One 递推无力orz
    UVa 10192 Vacation 字符串dp
    UVa 11584 Partitioning by Palindromes 回文串dp
    UVa 10534 Wavio Sequence LIS
  • 原文地址:https://www.cnblogs.com/ajaxa/p/9068936.html
Copyright © 2011-2022 走看看