美文网首页
Python—闭包与装饰器

Python—闭包与装饰器

作者: LionKing_ | 来源:发表于2018-11-07 11:20 被阅读0次
    将之前学习Python的笔记整理记录下来。
    闭包
    概念:
      一种组织代码的结构,减少了参数传递,提高了代码的可重复使用性
      如果在一个内嵌函数里,对在外部函数内的变量进行引用,那么内嵌函数就被认为闭包。
    
    缺点:
      由于闭包引用了外部函数的局部变量,则外部函数的局部变量没有及时释放,消耗内存。
    
    前提:
      1.必须有一个内嵌函数
      2.内嵌函数必须引用外部函数的变量
      3.外部函数的返回值必须是内部函数对象
    
    举例:
      def func(a, b):
          def func_in(x):
             return a * x + b
          # 返回内部函数
          return func_in
    
      if __name__ == '__main__':
          ts = func(1, 1)
          # 传递参数
          print(ts(2))
    
    装饰器
    概念:
      1.装饰器其实是用闭包来实现的。
      2.本质上是一个python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。
      3.装饰器不能对被装饰的函数内部进行操作 只能在函数执行之前或者后面添加功能。
    
    应用场景:
      参数检查(Agrument checking)
      缓存(Caching)
      代理(Proxy)
      提供上下文(Context Provider)
    
    装饰器执行/装饰顺序:
      装饰由下到上 执行由上到下
    
    举例:
      def add_fun(func3):
        # 定义不定长参数 接收
        def fun_in(*args, **kwargs):
            print("---add----")
            # 无论有没有返回值 都接受
            ret = func3(*args, **kwargs)
            return ret
        return fun_in
    
      # 装饰有参数的函数
      @add_fun
      def func(fun):
          print("fun ", fun)
    
      # 装饰有返回值的函数
      @add_fun
      def func1():
          return "func1"
    
      if __name__ == '__main__':
          func(123)
          ret = func1()
          print(ret)
    
    闭包和装饰器区别:
      装饰器需要传递被装饰的函数对象给装饰器
      闭包则需要传递变量给内嵌函数
    

    相关文章

      网友评论

          本文标题:Python—闭包与装饰器

          本文链接:https://www.haomeiwen.com/subject/bzvmxqtx.html