我们定义一个打印日志的函数:
def log(func):
def wrapper(*args, **kw):
print('call %s():' % func.__name__)
return func(*args, **kw)
return wrapper
然后我们设置一个now函数打印一下日期:
@log
def now():
print("2019-1-17")
注意我们加上了一个@log,表示启动装饰器,打印结果:
call now()
2019-1-17
我们可以这样理解,我们的log函数是带了一个参数,是函数,然后我们放在了now函数前面,就会自动把now作为参数带入执行log函数返回了wrapper,然后我们执行了now(),也就是执行了返回的wrapper函数,先是打印了日志(新的now函数),然后是执行了旧的now函数(打印日期)
练习:
请设计一个decorator,它可作用于任何函数上,并打印该函数的执行时间:
import time, functools
def log(func):
def wrapper(*args, **kw):
start=time.time()
x = func(*args, **kw)
print('%s execute in %s ms' % (func.__name__, (time.time()-start)*1000))
return x
return wrapper
@log
def fast():
time.sleep(0.0012)
fast()
我们在函数开始的时候记录一下时间start,然后结束的时候打印一下运行时间