代碼執行邏輯為是什么樣子的?
我加了幾句輸出語句想看看decorator中的代碼如何運行的:
但是結果我不太明白,還有一個問題為什么我輸出f的時候啥都沒有?f不應該是fectorial(10)這個函數么 ?
還有一個問題,這個寫法是固定的么?(第一個函數參數是@xxx(a)的a,第二個函數參數一定是@xxx修飾的函數,第三個函數的參數一定是函數factorisl的參數)?
這些地方有點不太明白,請教大佬可否幫我理解一下...
我加了幾句輸出語句想看看decorator中的代碼如何運行的:
但是結果我不太明白,還有一個問題為什么我輸出f的時候啥都沒有?f不應該是fectorial(10)這個函數么 ?
還有一個問題,這個寫法是固定的么?(第一個函數參數是@xxx(a)的a,第二個函數參數一定是@xxx修飾的函數,第三個函數的參數一定是函數factorisl的參數)?
這些地方有點不太明白,請教大佬可否幫我理解一下...
2020-03-09
舉報
2020-03-28
對于第一個問題:
可以解析代碼的執行過程
@decorator('ms')? 其實就等于factorial = decorator('ms')(factorial)
factorial = decorator('ms')(factorial)這句代碼 執行是先執行decorator('ms')按返回 su函數名-->接著執行su(f) 返回ssu函數名?? 到這里就等于?? factorial=ssu
之后調用factorial 其實是調用ssu 即factorial(10)? ->ssu(10)
而在ssu 的執行順序是? print "x=",x? …… return r?? -->執行 factorial(10)的原函數
所以整個執行就是你的輸出結果
第二問題嘛,寫法應該是固定的 不過函數名是可變的。當然咱不是大佬,所以如果有其它的特殊用法也就不太清楚了。
原因嘛就是 :
第一層def? 即標簽名函數 要傳參
第二層def? 即裝飾器函數 要傳被裝飾的函數名
第三層def 即函數別名? 即是第二層要返回的裝飾后的函數
2020-03-10