• 上下文管理协议__enter__和__exit__


    '''上下文管理协议__enter__和__exit__'''
    with open('day62.py', 'r') as f:
       pass
    # 上述叫做上下文管理协议,即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中代码块执行完毕时执行我啊')
    #     print(exc_type) # with代码块无异常,打印None
    #     print(exc_val) # with代码块无异常,打印None
    #     print(exc_tb) # with代码块无异常,打印None
    #
    # with Open('a.txt') as f1:
    #  print('===>执行代码块') # 先触发执行__enter__,然后执行with中代码,最后执行__exit__
    #  print(f1) # <__main__.Open object at 0x0000014AD1A58490> (Open类中__enter__返回的是实例本身,如果没有返回则打印None)
    #  print(f1.name) # a.txt (如果Open类中__enter__没有返回实例本身,那么调用不到此实例属性)
    
    
    # class Open_1:
    #  def __init__(self, name):
    #     self.name = name
    #
    #  def __enter__(self):
    #     return self
    #
    #  def __exit__(self, exc_type, exc_val, exc_tb):
    #     print(exc_type) # <class 'NameError'> 对应异常类
    #     print(exc_val) # name 'ababab' is not defined 对应异常值
    #     print(exc_tb) # <traceback object at 0x0000027C6F1A1D40> 对应异常追踪信息
    #
    # with Open_1('b.txt') as f2:
    #  print(ababab) # 无此变量名
    #  print(f2.name) # 遇到异常执行完__exit__就停止且没有再执行此步操作了
    # print('******') # 此步操作也没有进行打印
    # 且最后会报错
    # Traceback (most recent call last):
    #   File "C:/Users/XHP/PycharmProjects/python_quanzhan/s1/day63.py", line 43, in <module>
    #     print(ababab) # 无此变量名
    # NameError: name 'ababab' is not defined
    
    
    # class Open_2:
    #  def __init__(self, name):
    #     self.name = name
    #
    #  def __enter__(self):
    #     return self
    #
    #  def __exit__(self, exc_type, exc_val, exc_tb):
    #     print(exc_type) # <class 'NameError'> 对应异常类
    #     print(exc_val) # name 'ababab' is not defined 对应异常值
    #     print(exc_tb) # <traceback object at 0x0000027C6F1A1D40> 对应异常追踪信息
    #     return True
    #
    # with Open_2('c.txt') as f3:
    #  print(ababab) # 无此变量名
    #  print(f3.name) # 不会打印(__exit__的运行完毕就代表了整个with语句的执行完毕)
    # print('******') # 会打印(__exit__加入了return True后,还会执行with代码块以外的操作)
    # 无报错信息
    while True: print('studying...')
  • 相关阅读:
    Java使用google开源工具Thumbnailator实现图片压缩
    nginx基本配置
    CopyPropertis
    微服务(Microservices )简介
    jQuery ajax()使用serialize()提交form数据
    $.getJSON( )的使用方法简介
    理解 CSS 的 z-index 属性
    JS中的call()和apply()方法
    CSS文字换行详细解说
    如何实现JS函数的重载
  • 原文地址:https://www.cnblogs.com/xuewei95/p/14752561.html
Copyright © 2020-2023  润新知