• 且将生活一饮而尽之上下文管理与装饰器


    上下文管理协议

    • 定义:上下文管理协议,即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("且将生活一饮而尽")
      """
      <<且将生活一饮而尽>>
      """
      
  • 相关阅读:
    MyEclipse WebSphere开发教程:WebSphere 7安装指南(四)
    【DevExpress v17.2新功能预告】增强ASP.NET TreeList
    MyEclipse WebSphere开发教程:WebSphere 7安装指南(三)
    【DevExpress v17.2新功能预告】增强ASP.NET GridView的功能
    MyEclipse WebSphere开发教程:WebSphere 7安装指南(二)
    css如何设置首行文字缩进?
    css可以修改超链接颜色吗?
    css如何将图片横向平铺?
    CSS三种布局模型是什么?
    css怎么样设置透明度?
  • 原文地址:https://www.cnblogs.com/d9e84208/p/11297479.html
Copyright © 2020-2023  润新知