装饰器-2

装饰器

开发原则

  • 开放封闭原则

装饰器的作用

  • 在不改变原函数的调用方式的情况下,在原函数前后增加功能

装饰器的本质

  • 闭包函数

      #定义一个装饰器
      def wrapper(f):
          def inner(*args, **kwargs):
              ret = f(*args, **kwargs)
              return ret
          return inner
    
      @wrapper    #装饰器的使用
      def func():
              pass
      #调用函数
      func()

functool.wraps

  • 内置装饰器,可以将修饰的函数各种功能还原

      from funtools import wraps
      def wrapper(func):
          @wraps(func)
          def inner(*args, **kwargs)
              fet = func(*args, **kwargs)
              return fet
          return inner

带参数的装饰器

  • 需要给装饰器再外套一层
  • 个人理解:装饰器就是跳过了第一层函数,直接进入第二层函数,但是最后一层函数必须是闭包
  • 500个函数案例解决方案

          import time
          flag = Ture #定义一个判断参数
          def timer_out(flag):
              def timer(func):
                  def inner(*args, **kwargs)
                      if flag:
                          start = time.time()
                          ret = func(*args, **kwargs)
                          end = time.time()
                          print(end - start)
                          return ret
                      else:
                          ret = func(*args, **kwargs)
                          return ret
                  return inner
              return timer
    
          #timer = time_out(flag)
          @timer_out(flag)    #给装饰器一个参数的时候,装饰器函数要再外套一层
          def func():
              pass

多个装饰器装饰一个函数

  • 多个装饰器就是装饰器的套用
  • 多个装饰器执行顺序是从下到上
  • 多个装饰器先执行距离 被装饰的函数 近的装饰器

      #定义装饰器1
      def wrapper1(f):
          def inner1(*args, **kwargs):
              print('wrapper1, before f')
              ret = f(*args, **kwargs)
              print('wrapper2, after f')
              return ret
          return inner1
    
      #定义装饰器2
      def wrapper2(f):
          def inner2(*args, **kwargs)
              print('wrapper2, before f')
              ret = f(*args, **kwargs)
              print('wrapper2, after f')
              return ret
          return inner2
    
      #调用装饰器  
      @wrapper2   #func=wrapper(func) --> func=wrapper(warpper(func)) 调用inner2(inner1)
      @wrapper1   #func = wrapper(func) 调用inner1
      def func():
          print('f')
          pass
    
      #调用函数   
      func()
      #结果
      wrapper2, before f
      wrapper1, before f
      f
      wrapper1, after f
      wrapper2, after f

猜你喜欢

转载自www.cnblogs.com/liliudong/p/9572744.html