詳細見:http://python.jobbole.com/86632/
python裝飾器本質上就是一個函數,它可以讓其他函數在不需要做任何代碼變動的前提下增加額外的功能,裝飾器的傳回值也是一個函數對象(函數的指針)。裝飾器函數的外部函數傳入我要裝飾的函數名字,傳回經過修飾後函數的名字;内層函數(閉包)負責修飾被修飾函數。從上面這段描述中我們需要記住裝飾器的幾點屬性,以便後面能更好的了解:
實質: 是一個函數
參數:是你要裝飾的函數名(并非函數調用)
傳回:是裝飾完的函數名(也非函數調用)
作用:為已經存在的對象添加額外的功能
特點:不需要對對象做任何的代碼上的變動
def w1(func):
def inner():
print('1')
return func()
return inner
@w1(文法糖)
def f1():
print("2")
return 3
a=f1()
print(a)
輸出:
1
2
3
總結:裝飾器比較符合設計模式的開閉原則,即修改關閉、擴充開放,在原有代碼不改變的情況,擴充新的功能。上面在執行f1之前先列印出1,就是類似于加了新功能,而最終的傳回值還是函數f1的傳回值3,也就是a=3。其實f1執行就在裡面的那句話return func(),既執行了函數f1函數體,傳回值也是f1的傳回值。做一個修改如下:
def w1(func):
def inner():
print('1')
return 5
return inner
@w1
def f1():
print("2")
return 3
a=f1()
print(a)
輸出:
1
5
為什麼傳回1,5?就是因為在裝飾器裡面沒有執行f1的語句,是以就沒有f1的任何語句執行。