如何真正的了解python裝飾器
合理使用裝飾器可以簡(jiǎn)化開(kāi)發(fā),并且使得代碼更加清晰。下面我們分別介紹兩種裝飾器,不帶參數(shù)的裝飾器和帶參數(shù)的裝飾器。
一、不帶參數(shù)的裝飾器
我們用一個(gè)實(shí)際的例子來(lái)引入裝飾器的概念,比如我們現(xiàn)在有一個(gè)方法A(),然后我們需要在方法A()執(zhí)行之前在終端打印"function is running",這時(shí)候我們可以在方法A()的開(kāi)始部分加上下面的代碼:
print("function is running")
但是如果我們不想修改方法A()的代碼,也可以重新寫(xiě)一個(gè)方法decorator(),然后把A()作為入?yún)?,代碼如下:
def decorator(fun):
@functools.wraps(fun)
def wrapper(*args, **kwargs):
print("Method is running")
return fun()
return wrapper
python中的方法可以作為參數(shù)傳入另一個(gè)方法,所以當(dāng)我們執(zhí)行decorator(A)的時(shí)候,返回的是一個(gè)方法,這個(gè)方法的本質(zhì)是先執(zhí)行print語(yǔ)句,然后再執(zhí)行A()。
但是這樣我們的調(diào)用代碼就需要進(jìn)行修改,也就是說(shuō)之前調(diào)用方法A(),現(xiàn)在的寫(xiě)法是調(diào)用decorator(A)(),為了不影響調(diào)用的代碼,我們使用python的語(yǔ)法糖改造方法A()的代碼。
@decorator def A(): # do something
實(shí)際上只是在A()的前面加上一行@decorator,這樣在我們的調(diào)用代碼就不需要改變了。
裝飾器中的@functools.wraps(fun)是為了保證返回的方法__name__屬性和入?yún)⒎椒╢un的__name__屬性相同。
二、帶入?yún)⒌难b飾器
在上面不帶參數(shù)的裝飾器中,我們實(shí)現(xiàn)了在執(zhí)行方法A()之前打印一行固定的字符串,如果我們想要打印不同的字符串就需要用帶參數(shù)的裝飾器。實(shí)際上就是在不帶參數(shù)的裝飾器上再封裝一層即可,代碼如下:
def decorator_par(name):
def decorator(fun):
@functools.wraps(fun)
def wrapper(*args, **kwargs):
print("Method {} is running".format(name))
return fun()
return wrapper
return decorator
這樣我們就可以在使用裝飾器的時(shí)候設(shè)置參數(shù)name,實(shí)現(xiàn)打印不同的信息。完整的代碼如下:
import functools
def decorator_par(name):
def decorator(fun):
@functools.wraps(fun)
def wrapper(*args, **kwargs):
print("Method {} is running".format(name))
return fun()
return wrapper
return decorator
@decorator_par("A")
def A():
print("I am A")
@decorator_par("B")
def B():
print("I am B")
A()
B()
執(zhí)行輸出為:
Method A is running I am A Method B is running I am B
可以看到我們?cè)诓桓淖兎椒ㄕ{(diào)用代碼的情況下,實(shí)現(xiàn)了在該方法之前打印特定的信息。
以上就是裝飾器的兩種實(shí)現(xiàn)示例,實(shí)際開(kāi)發(fā)中也可以將多個(gè)裝飾器進(jìn)行嵌套,可以實(shí)現(xiàn)更加復(fù)雜的需求。
內(nèi)容擴(kuò)展:
python函數(shù)式編程之裝飾器
1.開(kāi)放封閉原則
簡(jiǎn)單來(lái)說(shuō),就是對(duì)擴(kuò)展開(kāi)放,對(duì)修改封閉。
在面向?qū)ο蟮木幊谭绞街?,?jīng)常會(huì)定義各種函數(shù)。一個(gè)函數(shù)的使用分為定義階段和使用階段,一個(gè)函數(shù)定義完成以后,可能會(huì)在很多位置被調(diào)用。這意味著如果函數(shù)的定義階段代碼被修改,受到影響的地方就會(huì)有很多,此時(shí)很容易因?yàn)橐粋€(gè)小地方的修改而影響整套系統(tǒng)的崩潰,所以對(duì)于現(xiàn)代程序開(kāi)發(fā)行業(yè)來(lái)說(shuō),一套系統(tǒng)一旦上線,系統(tǒng)的源代碼就一定不能夠再改動(dòng)了。然而一套系統(tǒng)上線以后,隨著用戶(hù)數(shù)量的不斷增加,一定會(huì)為一套系統(tǒng)擴(kuò)展添加新的功能。
此時(shí),又不能修改原有系統(tǒng)的源代碼,又要為原有系統(tǒng)開(kāi)發(fā)增加新功能,這就是程序開(kāi)發(fā)行業(yè)的開(kāi)放封閉原則,這時(shí)就要用到裝飾器了。
2.什么是裝飾器
裝飾器,顧名思義,就是裝飾,修飾別的對(duì)象的一種工具。
所以裝飾器可以是任意可調(diào)用的對(duì)象,被裝飾的對(duì)象也可以是任意可調(diào)用對(duì)象。
3.裝飾器的作用
在不修改被裝飾對(duì)象的源代碼以及調(diào)用方式的前提下為被裝飾對(duì)象添加新功能。
以上就是如何真正的了解python裝飾器的詳細(xì)內(nèi)容,更多關(guān)于你真的了解python裝飾器么的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- python 裝飾器的使用與要點(diǎn)
- Python pytest裝飾器總結(jié)(實(shí)例詳解)
- Python classmethod裝飾器原理及用法解析
- Python unittest裝飾器實(shí)現(xiàn)原理及代碼
- python 裝飾器的實(shí)際作用有哪些
- 深入了解Python裝飾器的高級(jí)用法
- Python類(lèi)中的裝飾器在當(dāng)前類(lèi)中的聲明與調(diào)用詳解
- python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5信號(hào)與槽的高級(jí)使用技巧裝飾器信號(hào)與槽詳細(xì)使用方法與實(shí)例
- Python @property裝飾器原理解析
- 如何正確理解python裝飾器
相關(guān)文章
Python Django獲取URL中的數(shù)據(jù)詳解
這篇文章主要介紹了Python Django獲取URL中的數(shù)據(jù)詳解,小編覺(jué)得挺不錯(cuò)的,這里分享給大家,供需要的朋友參考2021-11-11
Python實(shí)現(xiàn)發(fā)票自動(dòng)校核微信機(jī)器人的方法
這篇文章主要介紹了Python實(shí)現(xiàn)發(fā)票自動(dòng)校核微信機(jī)器人的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05
Python實(shí)現(xiàn)過(guò)濾單個(gè)Android程序日志腳本分享
這篇文章主要介紹了Python實(shí)現(xiàn)過(guò)濾單個(gè)Android程序日志腳本分享,本文講解了原理、實(shí)現(xiàn)代碼、使用方法、最新代碼等內(nèi)容,需要的朋友可以參考下2015-01-01
Python異常處理與反射相關(guān)問(wèn)題總結(jié)
今天給大家?guī)?lái)的是關(guān)于Python的相關(guān)知識(shí),文章圍繞著Python異常處理與反射展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06
http通過(guò)StreamingHttpResponse完成連續(xù)的數(shù)據(jù)傳輸長(zhǎng)鏈接方式
這篇文章主要介紹了http通過(guò)StreamingHttpResponse完成連續(xù)的數(shù)據(jù)傳輸長(zhǎng)鏈接方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
全面解讀Python Web開(kāi)發(fā)框架Django
Django是一個(gè)開(kāi)源的Web應(yīng)用框架,由Python寫(xiě)成。采用MVC的軟件設(shè)計(jì)模式,主要目標(biāo)是使得開(kāi)發(fā)復(fù)雜的、數(shù)據(jù)庫(kù)驅(qū)動(dòng)的網(wǎng)站變得簡(jiǎn)單。Django注重組件的重用性和“可插拔性”,敏捷開(kāi)發(fā)和DRY法則(Don’t Repeat Yoursef)。2014-06-06
通過(guò) Python 和 OpenCV 實(shí)現(xiàn)目標(biāo)數(shù)量監(jiān)控
這篇文章主要介紹了如何通過(guò) Python 和 OpenCV 實(shí)現(xiàn)目標(biāo)數(shù)量監(jiān)控,本文通過(guò)實(shí)例代碼圖文的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01
python中的os.mkdir和os.makedirs的使用區(qū)別及如何查看某個(gè)模塊中的某些字母開(kāi)頭的屬性方法
這篇文章主要介紹了python中的os.mkdir和os.makedirs的使用區(qū)別及如何查看某個(gè)模塊中的某些字母開(kāi)頭的屬性方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03
python自動(dòng)從arxiv下載paper的示例代碼
這篇文章主要介紹了python自動(dòng)從arxiv下載paper的示例代碼,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下2020-12-12

