1、
def log(func): # 把函数传进来
def wrapper(*args, **kvargs): # *args, 无名字参数 。**kvargs 有名字参数
print 'before calling', func.__name__
print 'args', args, 'kvargs', kvargs
func(*args, **kvargs)
print 'end coding', func.__name__
return wrapper
@log # 相当于log(hello((name, age))
def hello(name, age):
print 'hello',name, age
if __name__ == '__main__':
hello('nowcode', 2)
结果:
before calling hello
args ('nowcode', 2) kvargs {}
hello nowcode 2
end coding hello
若改为
if __name__ == '__main__':
hello(name = 'nowcode', age = 2)
结果为:
before calling hello
args () kvargs {'age': 2, 'name': 'nowcode'}
hello nowcode 2
end coding hello
2、带有参数的装饰器
def log(level,*args, **kvargs): #处理参数
def inner(func): # 把函数传进来
def wrapper(*args, **kvargs):
print level,'before calling', func.__name__
print level,'args', args, 'kvargs', kvargs
func(*args, **kvargs)
print 'end coding', func.__name__
return wrapper
return inner
@log(level='INFO')
def hello(name, age):
print 'hello',name, age
if __name__ == '__main__':
hello(name = 'nowcode', age = 2)
输出为:
INFO before calling hello
INFO args () kvargs {'age': 2, 'name': 'nowcode'}
hello nowcode 2
end coding hello