在学习装饰器的时候,对带参数的装饰器有些不太理解 通过例子有了一点想法记录下来,后续遇到问题的时候回顾反思一下吧
问题:
打印出函数运行的时间,可以传入参数 选择打印s 或者 ms
代码:
import time
def performance(unit): #用来接收装饰函数的参数 unit
def performance_decorator(f): #接收需要装饰的函数 f
def wrapper(*args, **kw): #接收实际函数所需要的参数 (*args, **kw)
t1 = time.time()
f(*args, **kw) #运行实际的函数 f
t2 = time.time()
t = (t2 - t1) * 1000 if unit=='ms' else (t2 - t1)
print '%s cost %f%s...' % (f.__name__,t,unit)
return f(*args, **kw) #返回实际函数的运行结果
return wrapper #wrapper #实际上也是经过修饰之后的函数
return performance_decorator
@performance('ms')
def factorial(n):
return reduce(lambda x,y: x*y, range(1, n+1))
print factorial(10)
运行结果:
factorial cost 7.083893ms...
3628800
这里的重点是,需要通过三层的嵌套装饰器来实现带参数的装饰器,需要理解每一层的意义和作用