溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python裝飾器是什么東西

發(fā)布時(shí)間:2021-08-18 11:04:12 來(lái)源:億速云 閱讀:138 作者:chen 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“Python裝飾器是什么東西”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

今天說(shuō)說(shuō)帶參數(shù)的裝飾器,為了簡(jiǎn)化業(yè)務(wù)邏輯,只實(shí)現(xiàn)字符串大寫(xiě)轉(zhuǎn)換的需求,重點(diǎn)來(lái)關(guān)注裝飾器部分:

# 業(yè)務(wù)函數(shù)
def my_upper(text):
   value = text.upper()
   return value

print(my_upper("hello"))  # HELLO

現(xiàn)在需求有變更,核心業(yè)務(wù)不變,但是需要對(duì)轉(zhuǎn)換的的字符包裹一層HTM標(biāo)簽,輸出如: <p>HELLO</p>,最簡(jiǎn)單的辦法就是直接在函數(shù)里面修改邏輯,如:

def my_upper(text):
   value = text.upper()
   return "<p>" + value + "</p>"

又接到產(chǎn)品通知,需求有變更,還要在外面套一個(gè)div,于是你很不情愿地回去再修改:

def my_upper(text):
   value = text.upper()
   return "<div><p>" + value + "</p></div>"

如何應(yīng)對(duì)產(chǎn)品這種無(wú)止境的修改呢?

不過(guò),技術(shù)最終還是要為業(yè)務(wù)服務(wù),那我們就想一個(gè)可以靈活應(yīng)對(duì)產(chǎn)品的辦法吧,這里,裝飾器就是一個(gè)很好的方案。最終效果應(yīng)該是這樣:

@tag("p")
def my_upper(text):
   value = text.upper()
   return value

print(my_upper("hello")) #<p>HELLO</p>

如何實(shí)現(xiàn)呢?先從簡(jiǎn)單裝飾器開(kāi)始,實(shí)現(xiàn)一個(gè)不帶參數(shù)的裝飾器

def tag(func):
   def wrapper(text):
       value = func(text)
       return "<p>" + value + "</p>"

   return wrapper

@tag
def my_upper(text):
   value = text.upper()
   return value

調(diào)用

print(my_upper("hello")) # <p>hello</p>

@tag 語(yǔ)法糖等價(jià)于  my_upper = tag(my_upper)

my_upper("hello") 等價(jià)于 wrapper("hello") 盡管你不能直接訪問(wèn)wrapper,但可以這樣去理解

使用裝飾器,業(yè)務(wù)代碼一行的都沒(méi)改,只需要在函數(shù)定義處加上裝飾器,就實(shí)現(xiàn)了相同的功能,那么如何更靈活地通過(guò)參數(shù)來(lái)指定輸出的樣式呢?使用帶參數(shù)的裝飾器

帶參數(shù)的裝飾器

帶參數(shù)的裝飾器只需要在原來(lái)那個(gè)不帶參數(shù)的裝飾器基礎(chǔ)上之上在最外層套一個(gè)函數(shù),該函數(shù)中定義一個(gè)參數(shù),然后嵌套函數(shù)中引用該參數(shù)即可實(shí)現(xiàn)。從下圖看出,我只是把里面那個(gè)函數(shù)改了一下名字,其余和原來(lái)不帶參數(shù)的裝飾器是一樣的。有沒(méi)有覺(jué)得這樣更靈活?

Python裝飾器是什么東西

當(dāng)然,裝飾器不僅可以修飾函數(shù),還可以修飾類。

“Python裝飾器是什么東西”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI