美文网首页
Python闭包装饰器

Python闭包装饰器

作者: 心水Diana | 来源:发表于2018-12-03 16:15 被阅读0次

    闭包

    • 闭包实现
      • 函数嵌套
      • 外函数里包装一个内函数
      • 外函数作用域有一个局部数据对象
      • 内部函数对于外部函数作用域里非全局变量的引用
      • 外函数返回内部函数
    def func_wai(a):
        def func_nei():
            print(a)
        return func_nei()
    

    与递归有些类似,将尾递归中return,调用自己,更改为了内部函数

    闭包的意义
    • 实现函数内部变量的延续

      每个函数运行都会开辟新的内存空间,在函数结束时,内部变量都将被释放

      闭包则延续了局部变量的生命周期

    • 变量生命周期得到延续,同时也增加了内存损耗

      def wai():
          p = list(range(1000))
          def nei():
              p[0] += 1
              print(p[0])
          return nei
       
      func = wai() # p 是一个保持状态的变量
      #返回值载体 就相当于变量
      #当你不去释放一个变量,会一直存活的
      
      
    • 变量私有化

      每一次闭包函数执行后的返回值都是一个新的,这是因为函数运行首先开辟的都是一块新的函数临时空间 每一次闭包函数执行后,都是返回了一个不一样的闭包函数载体,那么这个载体里的变量,也是不一样的


    装饰器

    • 装饰器可以在函数运行前添加功能,并且不影响原有函数内容
      • 实际是将函数作为一个参数,带入到另外一个函数用运行
    # 简单的装饰器
    def wai(func):
        def nei():
            res = func()
            return res + '你好'
        return nei
    
    @wai
    def work():
        return '123'
    #------输出---------
    work()
    
    • 被装饰函数带参数

      def wai(func): #装饰器
          def nei(var1,var2):
              var1 = 100  #在闭包函数内部对被装饰函数参数进行干预
              var2 = 99
              return func(var1,var2)
          return nei
      
      @wai
      def work(a,b):
          return a + b
      
      res = work(20,30)  #wai(work)(a,b)
      print(res)
      
    • 装饰器带参数

      def A(*args):
          def B(func):
              def C(a,b):
                  print('我是被装饰函数的参数:',a,b)
                  print('我是装饰函数的参数:',*args)
                  return func
              return C
          return B
      @A('ss')
      def func(a,b):
          pass
      
      func(1,2)
      ----------
      我是被装饰函数的参数: 1 2
      我是装饰函数的参数: ss
      
    • 过程分析

      def wai(b_func): #外函数的参数是一个函数对象
          def nei():
              print("嘿嘿嘿") #在nei函数里写的代码基本上都是添加的功能
              return b_func() #这个是nei函数返回值,用来返回之前在wai函数所接收的参数
              #b_func()
              #return ''
          return nei #返回了wai函数里的这个定义好的闭包容器
      
      @wai #语法糖
      def func():
          print('哈哈哈哈')
          return 'func'
      
      res = func() #调用一个被装饰函数 其实相等于 wai(func)()
      print('func的返回值:',res)
      -------------------------------------
      #func() 传统函数调用
          #1: print('哈哈哈')
          #2: return None
      #func() 被装饰时调用 @wai
          #被装饰函数: func
          #装饰器函数: wai
          #1: wai(func) -> return nei
          #2: nei() ->
              #1: print("嘿嘿嘿")
              #2: return b_func()
                  #1: b_func() -> 'func'  #内部调用被装饰函数
                  #2: return 'func' #内部闭包函数的返回值 其实是被装饰函数的返回值
      

    相关文章

      网友评论

          本文标题:Python闭包装饰器

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