裝飾器一直是我們學習python難以理解并且糾結的問題,想要弄明白裝飾器,必須理解一下函數式編程概念,并且對python中函數調用語法中的特性有所了解,使用裝飾器非常簡單,但是寫裝飾器卻很復雜。為了講清楚裝飾器,我們講一個生動的例子如下(由于后文裝飾器的代碼例子,全程和這個形象生動的說明很一致,所以務必看懂這個例子):
舉個簡單的例子:假設很久之前你寫過一個函數,現(xiàn)在你突然有了個想法就是你想看看,以前那個函數在你數據集上的運行時間是多少,這時候你可以修改之前代碼為它加上計時的功能,但是這樣的話是不是還要大體讀讀你之前的這個的代碼,稍微搞清楚一點它的邏輯,才敢給它添加新的東西。這樣是不是很繁瑣,要是你之前寫的代碼足夠亂足夠長,再去讀它是不是很抓狂...
實際工作中,我們常常會遇到這樣的場景,可能你的需求還不只是這么簡單。那么有沒有一種可以不對源碼做任何修改,并且可以很好的實現(xiàn)你所有需求的手段呢?答案當然是有,這就是要介紹的python裝飾器。有了裝飾器,你除了不用擔心前面提到的問題,并且還可以很好的處理接下來要做的事:那就是現(xiàn)在你又有了一個新的需求,比如為另一個函數添加計時功能,這時就非常簡單了,把要裝飾的函數丟給裝飾器就好了,它會自動給你添加完功能并返回給你。
所以說:裝飾器本質上就是一個函數,它可以讓其他函數在不需要做任何代碼變動的前提下增加額外的功能,裝飾器的返回值也是一個函數對象(函數的指針)
那么要想理清楚裝飾器,我們必須先了解下面幾樣東西哦,如果對這些全部了解的話,那么裝飾器就很簡單了。
1,函數
函數是什么呢?
在python中,使用關鍵字def和一個函數名以及一個可選的參數列表來定義函數,函數使用return關鍵字來返回值,我們一般說的函數是指函數名,比如foo,而foo()已經執(zhí)行函數了,foo()是什么類型取決于return的內容是什么類型!!!
函數的作用是什么?
減少重復代碼
使程序變得可擴展
使程序變得易維護
2,函數作用域
在python函數中會創(chuàng)建一個新的作用域,python高手也會稱函數有自己的命名空間,也就是說,當函數體中遇到變量時候,python首先會在該函數的命名空間中尋找變量名,python中有幾個函數用來查看命名空間。
3,函數即對象
在python的世界里,函數和[1,2,3],'abc',8等一樣都是對象,而且函數是最高級的對象(對象是類的實例化,可以調用相應的方法,函數是包含變量對象的對象)。
函數對象的調用僅僅比其他對象多了一個()而已,foo,bar和a,b一樣都是個變量名,為什么函數只有加載到內存里面才可以被調用?
注意:這里說的函數都是指函數名,比如foo;而foo()已經執(zhí)行函數了,foo()是什么類型取決于return的內容是什么類型!!!
以上內容為大家介紹了python裝飾器的概念,希望對大家有所幫助,如果想要了解更多Python相關知識,請關注IT培訓機構:千鋒教育。