修饰器
修饰器本质就是替换整个函数为修饰器函数来执行。
修饰器一层又一层的return让人都有点头晕,最直观的修饰器行为可以简单的理解为以下行为:、
def log(func): def wrapper(*args, **kw): print 'call %s():' % func.__name__ return func(*args, **kw) return wrapper @log def now(): print '2013-12-25'
实际上当你执行
now()
的时候,解释器帮你转换成了
log(now)(*args,**kw)
其中 *args以及**kw是传入now的参数。
带有参数的修饰器也是同样的道理
def log(text): def decorator(func): def wrapper(*args, **kw): print '%s %s():' % (text, func.__name__) return func(*args, **kw) return wrapper return decorator @log('execute') def now(): print '2013-12-25'
你执行
now()
的时候,解释器帮你转换成了
log('execute')(now)(*args,**kw)
其中 *args以及**kw是传入now的参数。
解释器在执行修饰器函数时,是转换成修饰器的函数,并且转换规律如下:
@test(aa,bb,cc)
test(aa,bb,cc)()()
也就是在你修饰器的基础上加上两个括号(不管你修饰器有没有带参数,都是在后面加两个括号),第一个括号传入具体函数名字,第二个括号传入具体函数的参数
知道这层规律,再写修饰器的时候就不会那么困惑了,改返回几个嵌套的函数,或者参数怎么传,都能很快的写出来了