裝飾器功能有兩點:1.首先自動執行裝飾器@后面跟的這個函數,并將裝飾器修飾的那個函數名作為參數帶入裝飾器@后面函數;2.將裝飾器后面函數的返回值,賦值給裝飾器所修飾的那個函數。舉個例子說明:
1 def outer(func): 2 def inner(): 3 print('log') 4 ret = func() 5 print('after') 6 return ret 7 return inner 8 9 @outer 10 def f1(): 11 print('F1')
其中@outer即為裝飾器函數,按照上面介紹,首先執行Outer函數,將f1函數的函數名f1作為outer的參數,執行outer(f1),然后outer()執行的返回值inner賦值給f1,這段代碼執行下來,也就是inner()替代了f1()。由于inner()函數內部調用了func也就是f1,所以就會在f1執行的前后分別打印輸出一個"log"和"after"。
簡單理解就是:裝飾器函數func代表老的f1()函數,執行打印F1的操作,而inner()代表新的f1函數。