装饰器本身就是一个函数,装饰器要与被装饰的函数建立连接,需在被装饰函数前加(@函数名)
1.无参装饰器
def outer(fun):
def wrapper():
print'前验证'
fun()
print'后验证'
return wrapper
@outer
def fun1():
print'fun1'
fun1()
输出结果:
前验证
fun1
后验证
定义fun1函数,outer是装饰函数,函数执行到@outer时,@outer = outer(fun1),就是把fun1函数当成参数传给outer函数的fun,然后返回的wrapper函数就是fun1
2.有参装饰器
def outer(fun):
def wrapper(a):
print'验证'
fun(a)
print'结束'
return wrapper
@outer
def fun1(a):
print'fun1',a
fun1('哈哈哈')
输出结果:
验证
fun1 哈哈哈
结束
3.在原函数上加返回值
def outer(fun):
def wrapper(a):
print'验证'
aaa =fun(a)
print'结束'
return aaa
return wrapper
@outer
def fun1(a):
print'fun1',a
return'原函数返回值'
result = fun1('哈哈哈')
print result
输出结果:
验证
fun1 哈哈哈
结束
原函数返回值
原函数被装饰器包装成新函数后还能返回原函数的返回值