裝飾器本身就是一個函數,裝飾器要與被裝飾的函數建立連接,需在被裝飾函數前加(@函數名)
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 哈哈哈
結束
原函數返回值
原函數被裝飾器包裝成新函數後還能返回原函數的返回值