闭包是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回答
-
闭包不是装饰器的基础,但是是装饰器的一种应用。闭包你只需要看看是否有变量在函数执行完成后没有释放
012019-08-26