修饰器

修饰器本质就是替换整个函数为修饰器函数来执行。

修饰器一层又一层的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)()()

也就是在你修饰器的基础上加上两个括号(不管你修饰器有没有带参数,都是在后面加两个括号),第一个括号传入具体函数名字,第二个括号传入具体函数的参数

知道这层规律,再写修饰器的时候就不会那么困惑了,改返回几个嵌套的函数,或者参数怎么传,都能很快的写出来了


发表评论