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

    传统方式:

    open('a.txt')
    文件操作
    x.close()//关闭文件句柄,减少内存浪费

    with open('a.txt') as f open是一个类 f是一个对象
    获取了一个对象 赋值给对象“f”

    上下文管理协议,即with语句,为了让一个对象兼容with语句,必须在这个对象的类中声明__enter__和__exit__方法
    例子:
    class Open:
    def __init__(self,name):
    self.name=name

    def __enter__(self):
    print('出现with语句,对象的__enter__被触发,有返回值则赋值给as声明的变量')
    # return self
    def __exit__(self, exc_type, exc_val, exc_tb):
    print('with中代码块执行完毕时执行我啊')


    with Open('a.txt') as f:
    print('=====>执行代码块')
    # print(f,f.name)

    __exit__()中的三个参数分别代表异常类型,异常值和追溯信息,with语句中代码块出现异常,则with后的代码都无法执行
    class Open:
    def __init__(self,name):
    self.name=name

    def __enter__(self):
    print('出现with语句,对象的__enter__被触发,有返回值则赋值给as声明的变量')

    def __exit__(self, exc_type, exc_val, exc_tb):
    print('with中代码块执行完毕时执行我啊')
    print(exc_type)
    print(exc_val)
    print(exc_tb)

    with Open('a.txt') as f:
    print('=====>执行代码块')
    raise AttributeError('***着火啦,救火啊***')
    print('0'*100) #------------------------------->不会执行

    如果__exit__返回值为True,那么异常会被清空,就好像啥都没发生一样,with后的语句正常执行

    class Open:
    def __init__(self,name):
    self.name=name

    def __enter__(self):
    print('出现with语句,对象的__enter__被触发,有返回值则赋值给as声明的变量')

    def __exit__(self, exc_type, exc_val, exc_tb):
    print('with中代码块执行完毕时执行我啊')
    print(exc_type)
    print(exc_val)
    print(exc_tb)
    return True

    with Open('a.txt') as f:
    print('=====>执行代码块')
    raise AttributeError('***着火啦,救火啊***')
    print('0'*100) #------------------------------->会执行

    总结
    with obj as f:
    '代码块'

    1.with obj ----》触发obj.__enter__(),拿到返回值

    2.as f----->f=返回值、

    3.with obj as f 等同于 f=obj.__enter__()

    4.执行代码块
    一:没有异常的情况下,整个代码块运行完毕后去触发__exit__,它的三个参数都为None
    二:有异常的情况下,从异常出现的位置直接触发__exit__
    a:如果__exit__的返回值为True,代表吞掉了异常
    b:如果__exit__的返回值不为True,代表吐出了异常
    c:__exit__的的运行完毕就代表了整个with语句的执行完毕

    用途或者说好处:

    1.使用with语句的目的就是把代码块放入with中执行,with结束后,自动完成清理工作,无须手动干预
    2.在需要管理一些资源比如文件,网络连接和锁的编程环境中,可以在__exit__中定制自动释放资源的机制,
    你无须再去关系这个问题,这将大有用处

    异常三要素:(是对象就有一个类)
    异常类
    异常值
    traceback追踪信息

  • 相关阅读:
    ORACLE 循环
    C#生成指定数目的互不相同的随机数(转)
    Oracle自治事务的介绍
    螺旋矩阵--我的实现方法
    一个体育生的编程之路(一)
    判断十二星座——我的算法,大家看是不是比较简便
    简单的排序算法——插入排序,选择排序,交换排序(冒泡排序,快速排序)
    使用VC和DirectShow从摄像头中读取图像(一)
    1999那个追着打我的女生
    我自己写的几个C++常用方法
  • 原文地址:https://www.cnblogs.com/jinpingzhao/p/12916262.html
Copyright © 2011-2022 走看看