1、先看一个使用time()的一个程序:
<span style="font-size:14px;">import time
def timer(func):
def _timer(*args,**kwargs): #参数是函数调用传递过来的参数
begin=time.time()
time.sleep(2)
func(*args,**kwargs)
a = time.time()-begin
print(a)
return _timer
@timer
def log(info):
print (info)
log('sleep few seconds')
</span>
在Python3.5下运行如下:
<span style="font-size:14px;">sleep few seconds
2.0055317878723145
>>> </span>
其实上面可以理解为:log=timer(log('sleep few seconds')),先执行内层,再执行外层
上面的测试函数人为的sleep时间是2,如果要随意设置sleep时间,这就轮到带参数的装饰器出场了:
import time
def htimer(minuts):
def _htimer(func):
def _deco(*args,**kwargs):
begin=time.time()
time.sleep(minuts)
func(*args,**kwargs)
print (time.time()-begin)
return _deco
return _htimer
@htimer(5)
def logh(info):
print (info)
logh('sleep few seconds')
在Python3.5运行结果如下:
sleep few seconds
5.0145933628082275
>>>
我们可以看到此程序的调用顺序:logh=htimer(1)(logh(‘sleep few seconds'))
常见的装饰器模式有参数检查,缓存,代理,和上下文提供者。