zoukankan      html  css  js  c++  java
  • 且将生活一饮而尽之上下文管理与装饰器

    上下文管理协议

    • 定义:上下文管理协议,即with语句,为了让一个对象兼容with语句,必须在这个对象的类中声明__enter____exit__方法

    • 示例一:

      class MyResource:
          def __enter__(self):
              print("connected")
              return self
      
          def __exit__(self, *args, **kwargs):
              print("close")
              # 遇到异常需要关闭的时候 里面返回True
              # 外层就不再抛异常  否者抛异常
              return True
      
          def query(self):
              print("query data")
      
      
      try:
          with MyResource() as obj_A:  # 这里面的obj_A 就是__enter__方法return self 实例化的对象
              obj_A.query()
      except Exception as e:
          print(e)
      """
      打印结果:
      connected
      query data
      close
      """
      
    • 示例二:

      class MyResource:
          def __enter__(self):
              print("connected")
              return self
      
          def __exit__(self, *args, **kwargs):
              print("close")
              # 遇到异常需要关闭的时候 里面返回True
              # 外层就不再抛异常  否者抛异常
              return True
      
          def query(self):
              print("query data")
      
      
      try:
          with MyResource() as obj_A:
              1 / 0  # 这个位置就直接退出
              obj_A.query()
      except Exception as e:
          print(e)
      """
      打印结果:
      connected
      close
      """
      
      
    • contextmanager 实现上下文管理协议

      class MyResource:
          def query(self):
              print("query data")
              
      from contextlib import contextmanager
      
      @contextmanager
      def make_myresource():
          print("connected")
          yield MyResource()   # 这里面将实例化的MyResource()给r
          print("close")
          
      with make_myresource() as r:
          r.query()
      """
      result:
      connected
      query data
      close
      """
      
    • 且将生活一饮而尽之上下文管理

      from contextlib import contextmanager
      
      
      @contextmanager
      def book_mark():
          print("<<", end='')
          yield
          print('>>', end='')
      
      
      with book_mark():
          print("且将生活一饮而尽", end='')
      """
      <<且将生活一饮而尽>>
      """
      
    • 且将生活一饮而尽之装饰器

      def outer(f):
          def inner(*args, **kwargs):
              print("<<", end="")
              f(*args, **kwargs)
              print(">>", end="")
          return inner
      
      @outer
      def println(str):
          print(str, end="")
      
      println("且将生活一饮而尽")
      """
      <<且将生活一饮而尽>>
      """
      
  • 相关阅读:
    GridView中实现可收缩的面板
    android之xml数据解析(Pull)
    android之xml数据解析(DOM)
    android intent 传递list或者对象
    Android之单元测试
    Directx11教程(48) depth/stencil buffer的作用
    Directx11教程(47) alpha blend(4)雾的实现
    Directx11教程41 纹理映射(11)
    Directx11教程40 纹理映射(10)
    Directx11教程(46) alpha blend(3)
  • 原文地址:https://www.cnblogs.com/d9e84208/p/11297479.html
Copyright © 2011-2022 走看看