濮阳杆衣贸易有限公司

主頁 > 知識庫 > 理解python中裝飾器的作用

理解python中裝飾器的作用

熱門標簽:旅游廁所地圖標注怎么弄 宿州電話機器人哪家好 地圖標注與注銷 成都呼叫中心外呼系統(tǒng)哪家強 百應電話機器人總部 電梯新時達系統(tǒng)外呼顯示e 西青語音電銷機器人哪家好 無錫智能外呼系統(tǒng)好用嗎 南昌地圖標注

裝飾器的作用就是用一個新函數(shù)封裝舊函數(shù)(是舊函數(shù)代碼不變的情況下增加功能)然后會返回一個新函數(shù),新函數(shù)就叫做裝飾器,一般為了簡化裝飾器會用語法糖@新函數(shù)來簡化

例子:

這是一段代碼,但功能太少,要對這個進行增強,但又不能改變代碼。

def hello():
    return "hello world!"

現(xiàn)在我們的需求是要增強hello()函數(shù)的功能,希望給返回加上HTML標簽,比如i>hello world/i>,但要求我們不得改變hello()函數(shù)原來的定義。

def makeitalic(fun):#makitalic傳了一個新函數(shù)
    def wrapped():#內(nèi)部函數(shù)
        return "i>"+fun()+"/i>"#要加的新功能
    return wrapped#返回的是wrapped函數(shù)功能

def hello():#對這個功能進行增強
    return "hello world!"
#makeitalic里面?zhèn)魅肓薶ello函數(shù),然后內(nèi)部函數(shù)fun()函數(shù)也就相當于hello函數(shù)了
hello_2=makeitalic(hello)
#打印新函數(shù),返回的就是i>hello world!/i>
print(hello_2())

為了增強原函數(shù)hello的功能,定義了一個函數(shù),它接收原函數(shù)作為參數(shù),并返回一個新的函數(shù),在這個返回的函數(shù)中,執(zhí)行了原函數(shù),并對原函數(shù)的功能進行了增強。

事實上,makeitalic就是一個裝飾器(decorator),它封裝了原函數(shù)hello,并返回了一個新函數(shù),用于增強原函數(shù)的功能,并將其賦值給hello。

一般情況下,我們使用裝飾器提供的@語法糖(Syntactic Sugar),來簡化上面的操作。

####使用@語法糖
def makeitalic(fun):
    def wrapped():
        return "i>" + fun() + "/i>"
    return wrapped

@makeitalic#使用了裝飾器可以直接調(diào)用,不需要賦值了
def hello():
    return "hello world"
print(hello())#使用了裝飾器可以直接調(diào)用,不需要賦值了

像上面的情況,可以動態(tài)的修改函數(shù)(或類的)功能的函數(shù)就是裝飾器。本質(zhì)上,它是一個高階函數(shù),以被裝飾的函數(shù)(比如上面的hello)為參數(shù),并返回一個包裝后的函數(shù)(比如上面的wrapped)給被修飾函數(shù)(hello)。

當調(diào)用hello()函數(shù)時,hello函數(shù)的執(zhí)行流程如下分析:

1.把hello函數(shù)作為參數(shù)傳給@符號后面的裝飾器函數(shù)。

2.然后開始執(zhí)行裝飾器函數(shù),并返回一個包裝了的函數(shù),同時,改變原函數(shù)的指向,現(xiàn)在原函數(shù)指向了這個包裝函數(shù)。

3.執(zhí)行原函數(shù),其實此時執(zhí)行的是包裝了的函數(shù),所以說,裝飾器增強了一個現(xiàn)有函數(shù)的功能,但不會改變現(xiàn)有函數(shù)的定義。

普通裝飾器的使用形式:

@decorator
def fun():
 pass

#格式就如同下面的:

def fun():
 pass
fun = decorator(fun)#不使用語法糖要進行賦值

裝飾器可以定義多個,離函數(shù)定義最近的裝飾器最先被調(diào)用,比如:

@decotator_one
@decorator_two
def fun():
 pass

#格式如同下面的:

def fun():
 pass
fun = decorator_one(decorator_two(fun))

裝飾器還可以帶參數(shù),比如:

@decorator(arg1, arg2)
def fun():
 pass

#格式如同下面的:

def fun():
 pass
fun = decorator(arg1, arg2)(fun)

到此這篇關(guān)于python中裝飾器的作用的文章就介紹到這了,更多相關(guān)python裝飾器作用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • python中有函數(shù)重載嗎
  • 在Python中實現(xiàn)函數(shù)重載的示例代碼
  • python裝飾器原理源碼示例分析
  • Python Pytest裝飾器@pytest.mark.parametrize詳解
  • 詳解Python裝飾器 給你的咖啡加點料
  • 如何正確理解python裝飾器
  • python 裝飾器的使用與要點
  • 如何利用飾器實現(xiàn) Python 函數(shù)重載

標簽:辛集 許昌 七臺河 濰坊 贛州 西安 雅安 渭南

巨人網(wǎng)絡(luò)通訊聲明:本文標題《理解python中裝飾器的作用》,本文關(guān)鍵詞  理解,python,中,裝飾,器,的,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《理解python中裝飾器的作用》相關(guān)的同類信息!
  • 本頁收集關(guān)于理解python中裝飾器的作用的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    吴江市| 敦煌市| 兖州市| 雷波县| 阿拉善右旗| 柘城县| 蓝山县| 太和县| 金坛市| 介休市| 云阳县| 邵武市| 鄂伦春自治旗| 伊通| 安岳县| 海林市| 皮山县| 黄石市| 乌拉特中旗| 德江县| 新巴尔虎左旗| 苗栗县| 延长县| 华阴市| 北京市| 黄浦区| 湖州市| 多伦县| 密云县| 云南省| 德兴市| 达拉特旗| 二手房| 定边县| 湖南省| 新平| 类乌齐县| 大渡口区| 中牟县| 当涂县| 万州区|