普通的不带参数的装饰器,写法如下:
def debug(func):
def wrapper(*args, **kwargs):
print 'debug start'
ret = func(*args, **kwargs)
print 'debug end'
return ret
return wrapper
@debug
def foo(arg1, arg2):
print 'foo', arg1, arg2
带参数的装饰器,写法如下:
def debug(level=1):
def wrapper(func):
def inner_wrapper(*args, **kwargs):
print 'debug start(level=%s)' % level
ret = func(*args, **kwargs)
print 'debug end(level=%s)' % level
return ret
return inner_wrapper
return wrapper
@debug(3)
def foo1(arg1, arg2):
print 'foo1', arg1, arg2
@debug()
def foo1(arg1, arg2):
print 'foo2', arg1, arg2
也就是说,不带参数的装饰器其实就是将原函数包装一下,而带参数的装饰器则是将原函数包装两下,其中外层的包装比较灵活,是“带参数”的。
本文出自夜惊心的博客,转载请保留出处