闭包与装饰器

闭包:

正常情况下,上例中a变量在return语句后,a变量会被释放。但由于内部inner函数继续调用a变量,导致a变量没有被释放。这种现象叫闭包

def outer():
    a=1
    def inner():
        print(a)
    return inner        #在这并没有执行inner函数。只是返回inner的对象
var = outer()()           #outer()() = inner()

 

 

装饰器

python装饰器本质上就是一个函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外的功能,装饰器的返回值也是一个函数对象(函数的指针)。装饰器函数的外部函数传入我要装饰的函数名字,返回经过修饰后函数的名字;内层函数(闭包)负责修饰被修饰函数。

# 1. 简单的装饰器
def test():
    print("人生苦短,我用python")
#
#
# 装饰器的书写步骤
# 1.书写闭包
# 2.传参:给outter设置参数,该参数表示需要被增加的功能函数
def outter(func):
    def inner():
        # 3.调用原函数
        func()
        # 4.增加新功能
        print("PYTHON")

    # 5.将装饰之后的结果返回【方便在函数外面调用】
    return inner
# 6.然后进行调用
f = outter(test)
f()



"""
装饰器的执行顺序:
1.f = outter(test),调用outter函数,func = test , f = inner
2.f(),调用inner函数
3.func(), 调用test原函数
"""
 

带参数的装饰器

#带参数的装饰器
def dec(flag):
    def add(fun):
        def inner(*args,**kwargs):
            if flag == '+':
                fun(*args,**kwargs)
            else:
                return None
        return inner
    return add
@dec(
'+') #如果需要在装饰器添加函数,则需要在装饰器函数里在包一层函数,用来接收参数 def fun2(a,b): print(a+b) fun2(1,2)

 

#执行顺序,首先执行dec('+'),返回add对象,
# 此时,将fun2对象作为参数, 传给add。返回inner对象。
#最后将inner接收fun2的1 2参数。在inner函数里调用fun2()。
# 总结:函数的参数,在inner函数接收。装饰器的参数,在最外层的装饰器函数接收。

 

posted @ 2022-11-13 22:19  powfu  阅读(26)  评论(0)    收藏  举报