闭包与装饰器

闭包

def func(y):
    def inner(x):
        req = x + y
        print("req", req)
    return inner
v = func(3)
v(2)

闭包指的是内层函数引用了外层函数的变量并且外边函数返回内部函数,inner叫闭包函数。

a = []
for i in range(3):
    def inner(x):
        return x**i
    a.append(inner)
for f in a:
    print(f(2))  # 结果是4 4 4

上述代码中,for循环最后i已经被定义为2,第二个循环开始才运行了inner函数,故inner中的i始终是2。解决办法是在 a.append(inner(2))直接执行或者利用闭包:

a = []
for i in range(3):
    def func(i):
        def inner(x):
            return x**i
        return inner
    a.append(func(i))
for f in a:
    print(f(2))

此时inner函数并没有及时执行,append中执行的是外层函数,但是inner闭包函数仍记录当时的变量i。

装饰器

def deractor1(func):
    def inner(*args, **kwargs):
        print("derac1 ----")
        req= func(*args, **kwargs)
        print("derac1 ++++")
        return req
    return inner


def deractor2(func):
    def inner(*args, **kwargs):
        print("derac2 ----")
        req= func(*args, **kwargs)
        print("derac2 ++++")
        return req
    return inner

@deractor2
@deractor1
def func():
    print("now")

deractor2(deractor1(func()))

结果是:
derac2 ----
derac1 ----
now
derac1 ++++
derac2 ++++
多个装饰器应用的时候,类似django的中间件的正逆执行。

原文地址:https://www.cnblogs.com/khal-Cgg/p/14630906.html