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