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






  • 相关阅读:
    数据移除的循环
    C#窗体多语言切换(简繁)
    C# 文字转换最简单的方法
    使用CodeDOM动态编译一个字符串表达式
    C#设置WebBrowser默认浏览器
    Image和字节数组互转
    苹果手机的SB系列(8)为什么没有短信全部删除?
    循环删除外键约束
    腾讯云COS自定义域名,支持https,CDN,私有访问
    腾讯云COS请求签名C#版
  • 原文地址:https://www.cnblogs.com/ajaxa/p/9068936.html
Copyright © 2011-2022 走看看