學Python裝飾器,最詳細的Python入門知識點


學Python裝飾器,最詳細的Python入門知識點

講 Python 裝飾器前,我想先舉個例子,雖有點汙,但跟裝飾器這個話題很貼切。

學Python裝飾器,最詳細的Python入門知識點

談裝飾器前,還要先要明白一件事,Python 中的函數和 Java、C++不太一樣,Python 中的函數可以像普通變量一樣當做參數傳遞給另外一個函數,例如:

學Python裝飾器,最詳細的Python入門知識點

學Python裝飾器,最詳細的Python入門知識點

先來看一個簡單例子,雖然實際代碼可能比這複雜很多:

學Python裝飾器,最詳細的Python入門知識點

說到這裡。順便提醒下大家不管你是為了Python就業還是興趣愛好,記住:項目開發經驗永遠是核心,如果你缺新項目練習或者沒有python精講教程,可以【轉發本文+關注,私信我 ‘p’ 自動獲取哦】,還可以跟老司機交流討教!
現在有一個新的需求,希望可以記錄下函數的執行日誌,於是在代碼中添加日誌代碼:

學Python裝飾器,最詳細的Python入門知識點


學Python裝飾器,最詳細的Python入門知識點

學Python裝飾器,最詳細的Python入門知識點


簡單裝飾器

學Python裝飾器,最詳細的Python入門知識點


@ 語法糖

學Python裝飾器,最詳細的Python入門知識點

學Python裝飾器,最詳細的Python入門知識點

*args、**kwargs可能有人問,如果我的業務邏輯函數 foo 需要參數怎麼辦?比如:

學Python裝飾器,最詳細的Python入門知識點

我們可以在定義 wrapper 函數的時候指定參數:

學Python裝飾器,最詳細的Python入門知識點

學Python裝飾器,最詳細的Python入門知識點

學Python裝飾器,最詳細的Python入門知識點

學Python裝飾器,最詳細的Python入門知識點


比如:

這時,你就可以把 wrapper 函數指定關鍵字函數:

學Python裝飾器,最詳細的Python入門知識點

帶參數的裝飾器

學Python裝飾器,最詳細的Python入門知識點


學Python裝飾器,最詳細的Python入門知識點


@use_logging(level="warn")等價於@decorator

類裝飾器

學Python裝飾器,最詳細的Python入門知識點

學Python裝飾器,最詳細的Python入門知識點

functools.wrps

學Python裝飾器,最詳細的Python入門知識點

例子:

學Python裝飾器,最詳細的Python入門知識點

學Python裝飾器,最詳細的Python入門知識點

裝飾器順序一個函數還可以同時定義多個裝飾器,比如:

學Python裝飾器,最詳細的Python入門知識點

學Python裝飾器,最詳細的Python入門知識點

總結:不管你是為了Python就業還是興趣愛好,記住:項目開發經驗永遠是核心,如果你缺新項目練習或者沒有python精講教程,可以【轉發本文+關注,私信我 ‘p’ 自動獲取哦】,還可以跟老司機交流討教!

本文的文字及圖片來源於網絡加上自己的想法,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。


分享到:


相關文章: