在python中、对于函数定义代码的理解_python中如何理解装饰器代码?
長文預警,【最淺顯易懂的裝飾器講解】
能不能專業地復制題目?配上代碼,問題分段。
我來給提主配上問題的代碼。
正式回答:
1:如何理解return一個函數,它與return一個值得用法區別在哪?
敲黑板,"python中,一切都是對象"。
值是對象,函數也是對象。
上圖,num是int類的實例對象,funcobj是function類的一個實例對象。
所以返回一個值和返回一個函數并沒有什么不同,本質都是返回一個對象。
但是由于值類型和函數類型的使用方法不同,值直接使用,函數需要加上()調用。
2.在wrapper函數中,為什么能返回一個在wrapper函數中沒有定義的func函數?
先更正你的提問,wrapper函數并沒有返回func函數,而是返回func函數的運行結果。
因此,作為參數傳遞給wrapper函數之后,wrapper當然可以調用func函數。
3.怎么理解在log中作為參數存在的func,在wrapper函數中成了函數?
相信你已經明白用對象的眼光看待,因此和問題2其實是一個問題。
4.這對log函數本身的使用有哪些影響,或者說當A函數的參數是一個函數時,如何使用A函數?
什么是裝飾器?裝飾器就是裝飾函數的!
問題圖中的log函數就是為了在不更改func的情況下,每次調用func之前,都會執行
想到了什么?日志!沒錯!
那么,你可能會問,為什么不在func函數print日志呢?
問得實在太好了!
1:如果func函數是你寫的,那么你當然可以這么做;如果不是你寫的,你這么做試試?
比如在系統open函數的最前面加上print()....
2:如果你有n個函數,在執行的前后都會執行一些類似的代碼。
以下是2個不同的寫法
顯然右邊代碼量更少,更容易維護,但是還有更好的寫法。
請注意,不修改add函數和sub函數的情況下,就為這2個不同的函數的執行前后增加了新的功能。
把add函數和sub函數裝飾得更強大了。
上述代碼后半段仍有改進的空間。
看,經過@decorator裝飾add和sub函數之后,使用時更方便了。
細心的朋友,相信已經注意到了add函數和sub函數的參數不一樣的。
沒有錯,我是故意的。
奧妙在于*args 和**kwgs,可變參數。
上圖是對指定參數、可變參數*args、可變**kwgs的示例。
對于裝飾器來說,不需要指定參數,因此只需*args和**kwgs即可以表示。
如果對你有幫助,請點贊支持。
總結
以上是生活随笔為你收集整理的在python中、对于函数定义代码的理解_python中如何理解装饰器代码?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hpzts04.exe是什么进程 有什么
- 下一篇: knn算法python理解与预测_理解K