zoukankan      html  css  js  c++  java
  • __enter__和__exit__

    __enter__(self)和__exit__(self, exc_type, exc_val, exc_tb)

    with语句也叫做上下文管理协议,为了让一个对象兼容with语句,必须在这个对象的类中声明enter和exit方法。

    with 对象会触发类的__enter__执行,enter的返回值就是as所赋予后面变量名的值。

    with内的代码块执行完毕后就会触发__exit__的执行。

    __exit__(self, exc_type, exc_val, exc_tb):三个参数分别代表异常类型、异常值和追溯信息,with语句中的代码块出现异常,则with后的代码都无法执行。

    写一个Open类,模拟with上下文管理。

    class Open:
        def __init__(self, path, mode='rt', encoding='utf-8'):
            self.f = open(path, mode, encoding=encoding)
    
        def __enter__(self):
            return self.f  # self.f会返回给as后面的变量名.
    
        def __exit__(self, exc_type, exc_val, exc_tb):  # 用来释放资源
            # 如果exc_type不为空,表示with上下文内部出了错误
            if exc_type:
                self.f.close()
                print('程序出错')
                raise exc_type
            self.f.close()
    
    with Open('b.txt',mode='rt',encoding='utf-8') as f:
        print(f.read())
    

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

    在需要管理一些资源比如文件,网络连接和锁的编程环境中,可以在exit中定制自动释放资源的机制,无须再去关心这个问题。


  • 相关阅读:
    Python 文件批量改名
    解决 unity 生成 android apk read Resources
    IIS 重定向 自动追加 eurl.axd 后缀
    多线程
    zookeeper面试
    线程之间的通信(thread signal)
    软考高项之计算题成本类计算
    PowerDesigner PDM 复制comment到name
    软考高项之计算题进度类
    全面理解Java内存模型
  • 原文地址:https://www.cnblogs.com/ChiRou/p/14238017.html
Copyright © 2011-2022 走看看