函数装饰器

1. 装饰器(重点, 难点)
  开闭原则:
  对功能的扩展开放
  对代码的修改是封闭

  通用装饰器语法:

  def wrapper(fn):
    def inner(*args, **kwargs): # 聚合
      在目标函数之前
      ret = fn(*arg, **kwargs) # 打散
      在目标函数之后
      return ret
    return inner

@wrapper
def func():
pass

func()

def play(a,b) :
    print("登陆",a,b)
    print("我卢本伟没有开挂")
    print("我29杀吃鸡")
    print("我无中生友秀的一批")

def wrapper(fn):
    def inner(*args,**kwargs) :
        print("我先打开外挂")
        print("打开直播")
        fn(*args,**kwargs)
        print("关闭外挂")
    return inner

play = wrapper(play)
play("卢本伟","abc")

  

2. 同一个函数被多个装饰器装饰

  @wrapper1
  @wrapper2
  @wrapper3
  def func():
    pass

  func()  >>> (  1 2 3 func 3 2 1  )

   

3. 带参数的装饰器()

   def wrapper_out(参数):
    def wrapper(fn):
      def inner(*args, **kwargs): # 聚合
        在目标函数之前
        ret = fn(*arg, **kwargs) # 打散
        在目标函数之后
        return ret
      return inner
    return wrapper

  @wrapper_out(实参) # 执行的时候. 先执行函数的调用然后使用返回值和前面的@组合成装饰器语法糖


  def func():
    pass

def play(a,b) :
    print("登陆",a,b)
    print("我卢本伟没有开挂")
    print("我29杀吃鸡")
    print("我无中生友秀的一批")
    return "卢本伟果然牛逼"
def wrapper_out(kan):
    def wrapper(fn):
        def inner(*args,**kwargs) :
            if kan != "仓鼠捶我" :
                print("我先打开外挂")
                print("打开直播")
                ret = fn(*args,**kwargs)
                print("关闭外挂")
                return ret
            else :
                ret = fn(*args, **kwargs)
                return ret
        return inner
    return wrapper

play = wrapper_out("仓鼠捶我")(play)
print(play("UU","PDD"))      #执行函数,并打印返回的值

  

posted on 2018-12-14 13:40  哎呀!土豆  阅读(101)  评论(0编辑  收藏  举报

导航