1.假设我们已经有了一个函数,功能很简单:打印两数之和
def add(i, j):
print i + j
2.现在我们想在打印和之前,先输出时间,怎么办
办法1:更改add函数,添加时间输出语句
办法2:不更改add函数,而是使用装饰器
显然办法2更加优雅,更加pythonic~
3.那装饰器怎么用呢,答案如下:
def time_decorator(func):
def wrapper(*args, **kw):
print time.ctime(time.time())
return func(*args, **kw)
return wrapper
@time_decorator
def add(i, j):
print i + j
4.怎么理解装饰器?
定义一个装饰器 time_decorator,并把@time_decorator置于add函数前面,等价于执行:
add = time_decorator(add)
由此可见,装饰器实际上就是把add被替换成新的函数wrapper,致使以后调用add都是调用wrapper。
因为add接受参数,所以time_decorator内部的wrapper也要接受参数,由于不知道具体参数是什么样子,所以直接写成通用形式*args, **kw。