"""
请大家跟我理解一下,如果在一个函数的内部定义了另一个函数,
外部的我们叫他外函数,内部的我们叫他内函数。

闭包:
  在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,
    并且外函数的返回值是内函数的引用。这样就构成了一个闭包。

"""

"""
# 闭包函数的实例
# outer是外部函数 a和b都是外函数的临时变量
def outer(a):
    b = 10

    # inner是内函数
    def inner():
        # 在内函数中 用到了外函数的临时变量
        print(a + b)

    # 外函数的返回值是内函数的引用
    return inner


if __name__ == '__main__':
    # 在这里我们调用外函数传入参数5
    # 此时外函数两个临时变量 a是5 b是10 ,并创建了内函数,然后把内函数的引用返回存给了demo
    # 外函数结束的时候发现内部函数将会用到自己的临时变量,这两个临时变量就不会释放,会绑定给这个内部函数
    demo = outer(5)
    # 我们调用内部函数,看一看内部函数是不是能使用外部函数的临时变量
    # demo存了外函数的返回值,也就是inner函数的引用,这里相当于执行inner函数
    demo()  # 15

    demo2 = outer(7)
    demo2()  # 17

"""

"""
闭包有啥用啊?装饰器!!!

代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)
"""


# 不带参装饰器
def log(func):
    def wrapper(*args, **kw):
        print('call %s():' % func.__name__)
        return func(*args, **kw)

    return wrapper


# 带参装饰器
def log1(text):
    def decorator(func):
        def wrapper(*args, **kw):
            print('%s %s():' % (text, func.__name__))
            return func(*args, **kw)

        return wrapper

    return decorator


if __name__ == '__main__':
    @log  # log(now)
    def now(name, age):
        print('2013-12-25')
        print(name, age)


    now(1, 3)


    @log1("execute")
    def now1():
        print('2013-12-25')


    now1()

results matching ""

    No results matching ""