9-装饰器

装饰器基础

  • 使用装饰器可以增加程序的灵活性,减少耦合度,适合使用在用户登陆检查、日志处理等方面

  • 装饰器语法

    • # Python装饰器语法:
      def out(f):
          def inner():
              f()
              print('这里写增加的装饰功能')
          return inner
      
    • 闭包

    • 装饰器内部调用函数

    • 函数的上下添加装饰

  • 函数调用

    • house = out(house)
      • # print(house._name_) # inner,house指向inner函数
    • house指向的函数是装饰器的内部函数(inner)
  • 给函数加装饰器

    • @装饰器

通用装饰器

  • 通用指的是带通用参数

  • 通用装饰器语法

    • def outer2(f):
          def inner(*args, **kwargs):
              print('开始唱歌了')
              r = f(*args, **kwargs)
              print('唱完了')
              return r
          return inner
      
      @outer2
      def sing2(singer, song, a):
          print(singer, '唱:', song, a)
          return 'Nice'
      
      result = sing2('贾玲', '老女孩', a=1)
      print(result)
      '''
      开始唱歌了
      贾玲 唱: 老女孩 1
      唱完了
      Nice
      '''
      
    • 如果原函数有返回值,那么装饰器函数也要有返回值进行返回,这样才能确保对原函数不做修改

  • 装饰器调用时使用参数

    • # 装饰器调用时使用参数,相当于多加了一个参数层
      def outer(is_hello):
          def inner(f):
              def inner_inner(*args, **kwargs):
                  if is_hello == 'hello':
                      print('hello Python')
                      return f(*args, **kwargs)
                  else:
                      return f(*args, **kwargs)
              return inner_inner
          return inner
      
      @outer('hello')  # 加装饰器
      def f_temp(*args, **kwargs):
          print(*args, **kwargs)
      
      # 调用
      f_temp('你好,世界')
      '''
      hello Python
      你好,世界
      '''
      
    • 如果装饰器在调用时使用了参数,那么装饰器函数只会使用这些参数进行调用,因此需要返回一个新的装饰器函数,这样就与普通的装饰器一致

栈和队列

    • 栈:一种数据结构

    • 特点:先进后出,后进先出

    • 列表可以实现栈结构,控制只在一端(只在列表末尾)插入append和取出pop

    • from queue import LIFOQueue

      • from queue import LifoQueue
        stack = LifoQueue(maxsize=3)
        stack.put('hello')
        stack.put('world')
        print(stack.get())  # world
        print(stack.get())  # hello
        
  • 队列

    • 队列:一种数据结构

    • 特点:先进先出,后进后出,类似排队

    • 创建队列

      • # 创建队列
        import collections.abc
        queue = collections.deque()
        print(queue)  # deque([])
        
    • 入队列:append

    • 出队列:popleft

原文地址:https://www.cnblogs.com/lotuslaw/p/14007494.html