Python闭包装饰器

闭包

  • 闭包实现
    • 函数嵌套
    • 外函数里包装一个内函数
    • 外函数作用域有一个局部数据对象
    • 内部函数对于外部函数作用域里非全局变量的引用
    • 外函数返回内部函数
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闭包装饰器)