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("且将生活一饮而尽")
      """
      <<且将生活一饮而尽>>
      """
      
  • 相关阅读:
    J2ME学习笔记之问题看法
    单词王(kingWord)
    TCP的粘包和拆包问题及解决办法(C#)
    vuex里mapState,mapGetters使用详解
    agelform formcreate 使 elementui form 组件更简单
    elementui 二次封装系列 button
    开源一套后台管理系统框架,远离996 记录
    客户端架构介绍
    简单的Unity学习项目,封装了一下简单、通用功能组件,适用于数据可视化展示
    Vue关于对象数组的双向数据绑定(props与watch)
  • 原文地址:https://www.cnblogs.com/d9e84208/p/11297479.html
Copyright © 2011-2022 走看看