裝飾器
裝飾器是幹什麼用的?
裝飾器可以在不修改某個函式的情況下,給函式新增功能。
形象點來說,從前有乙個王叔叔,他乙個人住在家裡,每天打掃家,看書。於是定義如下乙個函式:
def uncle_wang():
sweeping()
reading()
後來呢,有一天,大頭兒子一家搬到了王叔叔隔壁 ? 。根據劇情,一天,大頭兒子的媽媽請王叔叔來家裡吃飯,那麼,王叔叔的日程就新增了「去隔壁吃飯」這一項,但是又不能修改王叔叔之前的日程,怎麼實現?這時,就可以給王叔叔新增乙個裝飾器,給這個裝飾器起個名字,姑且就叫neighbor,然後就寫成這樣:
@neighbor
def uncle_wang():
sweeping()
reading()
然後王叔叔去大頭兒子家吃飯就提上日程啦,哈哈。(只是吃飯哦,不要想多了(⊙v⊙))
這個neighbor其實也是個函式,引數就是uncle_wang(沒錯,可以把函式名當成引數傳來傳去,還能當做返回值),在裝飾器裡面實現「去隔壁吃飯」:
def neighbor(func):
eat_next_door() # 自定義函式,去隔壁吃飯
return func # 原來的函式不變,直接返回
最後是執行,直接執行uncle_wang()即可
# 執行函式
uncle_wang() # 相當於不加裝飾器,直接執行 neighbor(uncle_wang)()
這感覺就像是用neighbor裝飾了uncle_wang,豐富了王叔叔的生活,從此變成了隔壁老王。實現方式就是套娃,給uncle_wang套個neighbor,變成neighbor(uncle_wang)(這整個東西是個函式名),然後呼叫這個函式: neighbor(uncle_wang)(),形如:函式名()
在python裡,這個套娃的操作簡化成了裝飾器,直接在原函式上面新增@neighbor,然後呼叫的時候還是寫成uncle_wang(),但是這個裝飾過的王叔叔已經不是原來的王叔叔了,他現在其實是隔壁老王。
王叔叔的新日程搞定了,但是還有個問題,就是順序。現在的日程順序相當於:
eat_next_door()
sweeping()
reading()
請人吃飯當然是吃晚飯啦,所以eat_next_door()需要排在最後面,而neighbor函式不能先返回(return func)然後才執行eat_next_door(),眾所周知,函式返回了就結束了,後面的東西都不管了。
所以,繼續套娃,再搞個函式進去,寫成這樣:
def neighbor(func):
func() # 相當於不帶裝飾器的 uncle_wang()
eat_next_door() # 自定義函式,去隔壁吃飯
這樣順序就對了,王叔叔很滿意~
現在這個裝飾器基本成型了,但是現在還不能處理原函式的引數和裝飾器函式的引數,繼續改進的實現方式可以去看廖雪峰老師的教程,寫得很不錯,我就是從那學來的。
附上完整**:
# !/usr/bin/env python3
# -*- coding: utf-8 -*-
def sweeping():
print('sweeping')
def reading():
print('reading')
def eat_next_door():
print('eat_next_door')
def neighbor(func):
func() # 相當於不帶裝飾器的 uncle_wang()
eat_next_door() # 自定義函式,去隔壁吃飯
@neighbor
def uncle_wang():
sweeping()
reading()
if __name__ == "__main__":
uncle_wang()
(嗨,又水了一篇,之前還說要測一下手動實現和庫函式實現的二分查詢的耗時差距,正事還是放到下次吧……)
python進去後是什麼樣子 進入Python世界
pycharm的使用以及個性化設定 file settings editor general change font size file settings editor font 修改預設字型大小 file settings editor color scheme python monokai 主題...
python教程是什麼 Python是什麼?
python是物件導向,高階語言,解釋,動態和多用途程式語言。python易於學習,而且功能強大,功能多樣的指令碼語言使其對應用程式開發具有吸引力。python的語法和動態型別具有其解釋性質,使其成為許多領域的指令碼編寫和快速應用程式開發的理想語言。python支援多種程式設計模式,包括物件導向程式...
python念什麼 python中 f是什麼意思
1 格式符 例如 a test print it is a s a 列印的結果就是 it is a test 2 單獨看 是乙個運算符號,求餘數。例如 求模運算,相當於mod,也就是計算除法的餘數,比如5 2就得到1。擴充套件資料 python中 常用的操作有 s,d,r等 s,r,d分別表示字串以...