日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

【Python学习教程】:装饰器的详细教程,通俗易懂

發布時間:2025/3/20 python 10 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Python学习教程】:装饰器的详细教程,通俗易懂 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

裝飾器是Python中的一個重要概念,多用于在不修改原函數的基礎上,為函數增加額外的功能。

基礎裝飾器

例如小李給女朋友買了一款iPhone12作為生日禮物,手機原封未拆封。

def gift():print('iPhone12')gift() # 運行顯示禮物信息

但還是覺得禮物太單薄,于是又買了一盒德芙巧克力,一支dior的口紅,并找了個精美的禮品盒包裝了一下,盒子里放滿了泡沫球。

''' 學習中遇到問題沒人解答?小編創建了一個Python學習交流QQ群:531509025 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' def gift():print('iPhone12')def box(gift):print('='*5 + '禮物盒' + '='*5)print('一盒泡沫球')print('好多巧克力')print('一支dior口紅')return giftgift = box(gift) # 將禮物包裝后作為禮物 gift() # 顯示禮物信息

運行后顯示如下:

=====禮物盒===== 一盒泡沫球 好多巧克力 一支dior口紅 iPhone12

這個box便是一個裝飾器,它的參數是一個函數對象,同數字、字符串、列表、字典等數據類型一樣,函數和類也可以作為函數的參數使用,畢竟在Python里人人平等,一切皆對象。
box在使用時依然返回了原來的gift,只是在拿到這個gift之前增加了兩個額外的驚喜,然后我們把box作為gift使用即可。

裝飾器本質上就是以函數作為參數,對函數做一些處理,并替換原函數的一種高階函數。
上例中,使用裝飾器表示為如下。

def box(gift): # 以函數為參數的裝飾器print('='*5 + '禮物盒' + '='*5)print('一盒泡沫球')print('好多巧克力')print('一支dior口紅')return gift@box # 掛載裝飾器,會自動替換原函數 def gift():print('iPhone12')gift() # 這里面得到的gift實際上是裝飾后的gift即`box(gift)`

運行后顯示和上例相同。

處理函數參數

小李突然想到,買哪個顏色應該征詢下女友的意見,也就是原來的gift應支持一個可供選擇的顏色參數。

def gift(color):print(f'iPhone12{color}版')

作為一個細心的boyfriend,小李需要根據對應的手機顏色選擇同樣顏色的泡沫球,也就是需要能獲取到,被裝飾的gift函數的參數。
這時候我們需要在盒子內部(box裝飾器),重新準備一個新的禮物,根據顏色參數做不同的處理,然后根據顏色拿到指定的iPhone12禮物。

''' 學習中遇到問題沒人解答?小編創建了一個Python學習交流QQ群:531509025 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' def box(gift):print('='*5 + '禮物盒' + '='*5)def new_gift(color): # 準備一個新的禮物,參數和原gift參數一致print(f'一盒{color}泡沫球') # 根據顏色準備泡沫球print('好多巧克力')print('一支dior口紅')return gift(color) # 根據顏色拿到指定的iPhone12return new_gift # 返回新禮物,新禮物調用時,增加一些驚喜,并返回原有禮物gift(color)的結果。@box def gift(color):print(f'iPhone12{color}版')gift('紅色') # 實際上這里的gift是被box裝飾后貍貓換太子的new_gift函數,而new_gift('紅色'),返回原gift('紅色')的結果。

在box內部為了根據參數做對應處理,我們新建了一個函數,函數內部也可以定義內部函數,內部函數new_gift可以獲取并使用外部box函數的參數,如gift。

為了能獲取到原有函數gift的參數,我們需要建立一個傀儡函數new_gift,這個函數和原函數gift的參數一致、返回結果一致,即new_gift('紅色')返回的就是gift(‘紅色’)。

然后貍貓換太子,不再返回原來的gift函數對象,而是返回替換的new_gift函數對象。

運行后顯示

=====禮物盒===== 一盒紅色泡沫球 好多巧克力 一支dior口紅 iPhone12紅色版

注意:在裝飾器box里,要返回一個函數對象,如上例中的return gift或本例中的return new_gift。而在傀儡函數new_gift中,為了和原函數gift結果一致,要返回原函數的調用結果即gift(color)。

從普遍意義上講,作為商家,為了裝飾器box可以包裝任何形式的禮物,無論禮物有什么參數都可以滿足,這就要求我們的傀儡函數new_gift支持任意類型的參數即def new_gift(*args, **kwargs)。
然后把無論什么參數*args,**kwargs交由原函數gift(*args, **kwargs)處理即可。
修改后,我們便得到一個通用的裝飾器,可以包裝任何禮物。

def box(gift):print('='*5 + '禮物盒' + '='*5)def new_gift(*args, **kwargs): # 接受任意數量的參數if args and len(args) > 0: # 由于參數不確定了,我們假設萬一有參數,第一個參數是color參數color = args[0]print(f'一盒{color}泡沫球')else:print(f'一盒泡沫球')print('好多巧克力')print('一支dior口紅')result = gift(*args, **kwargs) # 如果我們需要對原函數的結果做出處理,可以先獲取到結果# print(f'原函數結果{result}') 由于原函數gift沒有return,這是其實是Nonereturn result # 返回原函數結果return new_gift @box def gift(color, pro=False): # 新的禮物函數,兩個參數,默認買12,萬一女友要Pro,也可以if pro is True:print(f'iPhone12 Pro{color}版')else:print(f'iPhone12{color}版')gift('海藍色', pro=True)

這樣,無論被裝飾的函數有幾個參數,box裝飾器都可以正常處理。
運行后顯示如下。

=====禮物盒===== 一盒海藍色泡沫球 好多巧克力 一支dior口紅 iPhone12 Pro海藍色版

帶參裝飾器

信心滿滿的小李覺得,在盒子上還可以做些文章,要根據女友的喜好選擇不同形狀的箱子,因此我們需要根據參數來定制我們的裝飾器box,在盒子外面再加一層定制函數。

def custom_box(shape): # 根據參數定制裝飾器def box(gift): # 裝飾器函數print('='*5 + f'{shape}禮物盒' + '='*5) # 根據形狀定制# ...return box # 返回裝飾器函數

此時我們得到一個可以根據參數進行定制的裝飾器函數custom_box,這個裝飾器接收到參數后,傳遞給真實裝飾器box,并返回定制后box裝飾器函數。

完整代碼如下。

''' 學習中遇到問題沒人解答?小編創建了一個Python學習交流QQ群:531509025 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' def custom_box(shape): # 根據參數定制裝飾器 =====================def box(gift): # 實際的裝飾器函數 ---------------------------print('='*5 + f'{shape}禮物盒' + '='*5)def new_gift(*args, **kwargs): # 傀儡函數 ..............if args and len(args) > 0:color = args[0]print(f'一盒{color}泡沫球')else:print(f'一盒泡沫球')print('好多巧克力')print('一支dior口紅')result = gift(*args, **kwargs)return result # 返回原函數結果 ......................return new_gift # 返回傀儡函數 ---------------------------return box # 返回定制的裝飾器 ===============================@custom_box('心形') # 使用可定制的裝飾器 def gift(color, pro=False): if pro is True:print(f'iPhone12 Pro{color}版')else:print(f'iPhone12{color}版')gift('海藍色', pro=True)

注意:裝飾器在導入模塊時立即計算的,即沒調用gift(‘海藍色’, pro=True)之前就已經執行生成定制后的box。

運行后,結果如下。

=====心形禮物盒===== 一盒海藍色泡沫球 好多巧克力 一支dior口紅 iPhone12 Pro海藍色版

總結

以上是生活随笔為你收集整理的【Python学习教程】:装饰器的详细教程,通俗易懂的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。