闭包是python装饰器的基础吗?

来源:12-12 装饰器 五

最爱喝酸奶

2019-08-22

带参数的装饰器:

import time

def performance(unit):
    def perf_decorator(f):
        def wrapper(*args, **kw):
            t1 = time.time()
            r = f(*args, **kw)
            t2 = time.time()
            t = (t2 - t1) * 1000 if unit =='ms' else (t2 - t1)
            print 'call %s() in %f %s' %(f.__name__, t, unit)
            return r
        return wrapper
    return perf_decorator
    
@performance('ms')
def factorial(n):
    return reduce(lambda x,y: x*y, range(1, n+1))

print factorial(10)

@performance('ms') 完全等价于 factorial = performance('ms')(factorial)

对于performance()函数,形成一个闭包;对于perf_decorator()函数,也形成一个闭包。程序首先调用performance('ms'),返回perf_decorator,再将perf_decorator(factorial)得到的返回结果赋值给了factorial,这样factorial就变成了指向函数wrapper()的指针,经过装饰后的factorial(),其实是调用wrapper()

请教老师,这么理解有没有问题?到底有形成闭包吗?

写回答

1回答

7七月

2019-08-23

闭包不是装饰器的基础,但是是装饰器的一种应用。闭包你只需要看看是否有变量在函数执行完成后没有释放

0
1
最爱喝酸奶
非常感谢!
2019-08-26
共1条回复

Python3.8系统入门+进阶 (程序员必备第二语言)

语法精讲/配套练习+思考题/原生爬虫实战

14715 学习 · 4484 问题

查看课程