python中槽是什麼 Python裡的裝飾器

2021-10-12 10:49:52 字數 1995 閱讀 5062

裝飾器

裝飾器是幹什麼用的?

裝飾器可以在不修改某個函式的情況下,給函式新增功能。

形象點來說,從前有乙個王叔叔,他乙個人住在家裡,每天打掃家,看書。於是定義如下乙個函式:

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分別表示字串以...