Python函數(shù)裝飾器的示例分析

這篇文章給大家分享的是有關(guān)Python函數(shù)裝飾器的示例分析的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。

十載的向陽(yáng)網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。成都營(yíng)銷(xiāo)網(wǎng)站建設(shè)的優(yōu)勢(shì)是能夠根據(jù)用戶(hù)設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整向陽(yáng)建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)公司從事“向陽(yáng)網(wǎng)站設(shè)計(jì)”,“向陽(yáng)網(wǎng)站推廣”以來(lái),每個(gè)客戶(hù)項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

函數(shù)裝飾器是什么

函數(shù)裝飾器是一個(gè)可調(diào)用對(duì)象,它的參數(shù)是另外一個(gè)函數(shù)。比如:

@decorate def target():     print("running target()")

跟下面代碼效果是一樣的:

def target():     print("running target()")  target = decorate(target)

簡(jiǎn)單實(shí)現(xiàn)@decorate:

def decorate(func):     def inner():         print("running inner()")     return inner

測(cè)試一下:

>>> target() running inner() >>> target <function decorate.<locals>.inner at 0x04899D18>

新的target是decorate(target)返回的inner函數(shù)。

因?yàn)檠b飾器只是代碼優(yōu)化的一種手段,不像if語(yǔ)句for語(yǔ)句那樣,決定了程序流程,所以嚴(yán)格來(lái)說(shuō),裝飾器只是語(yǔ)法糖。它有兩個(gè)特性,一是能把被裝飾的函數(shù)替換成其他函數(shù),二是裝飾器在加載模塊時(shí)立即執(zhí)行。

裝飾器在導(dǎo)入時(shí)執(zhí)行

若想真正理解裝飾器,需要區(qū)分導(dǎo)入時(shí)和運(yùn)行時(shí)。函數(shù)裝飾器在導(dǎo)入模塊時(shí)立即執(zhí)行,而被裝飾的函數(shù)只在明確調(diào)用時(shí)運(yùn)行。

接下來(lái)通過(guò)示例對(duì)這個(gè)特性進(jìn)行說(shuō)明,新建registration.py模塊:

registry = []   def register(func):     # 裝飾器函數(shù)也可以不定義內(nèi)部函數(shù)     print("running register(%s)" % func)     registry.append(func)     return func   @register def f1():     print("running f1()")   @register def f2():     print("running f2()")   def f3():     print("running f3()")   def main():     print("running main()")     print("registry ->", registry)     f1()     f2()     f3()   if __name__ == "__main__":     main()

從結(jié)果能看出來(lái):

Python函數(shù)裝飾器的示例分析

  • @register作用到f1和f2上,在導(dǎo)入時(shí),在main()調(diào)用前就執(zhí)行了。

  • f3沒(méi)有裝飾器,就沒(méi)有在main()調(diào)用前執(zhí)行@register。

  • 在main()調(diào)用后,明確調(diào)用f1()、f2()、f3()才執(zhí)行函數(shù)。

import模塊能看得更明顯:

>>> import registration running register(<function f1 at 0x0189A730>) running register(<function f2 at 0x0189A6E8>)

裝飾器在導(dǎo)入時(shí)就執(zhí)行了。

使用裝飾器改進(jìn)策略模式

在《Python設(shè)計(jì)模式知多少》文章中提到了裝飾器可以更優(yōu)雅的實(shí)現(xiàn)策略模式的最佳策略,它的實(shí)現(xiàn)代碼如下:

promos = []  def promotion(promo_func):     promos.append(promo_func)     return promo_func  @promotion def fidelity(order):     """5% discount for customers with 1000 or more fidelity points"""     return order.total() * .05 if order.customer.fidelity >= 1000 else 0  @promotion def bulk_item(order):     """10% discount for each LineItem with 20 or more units"""     discount = 0     for item in order.cart:         if item.quantity >= 20:             discount += item.total() * .1     return discount  @promotion def large_order(order):     """7% discount for orders with 10 or more distinct items"""     distinct_items = {item.product for item in order.cart}     if len(distinct_items) >= 10:         return order.total() * .07     return 0  def best_promo(order):     """Select best discount available     """     return max(promo(order) for promo in promos)

它解決了"如果想要添加新的促銷(xiāo)策略,那么要定義相應(yīng)函數(shù)并添加到promos列表中"這個(gè)缺陷,并有更多優(yōu)點(diǎn):

  • 新的促銷(xiāo)策略,用@promotion裝飾器即可添加。

  • 促銷(xiāo)策略函數(shù)不用以_promo結(jié)尾,可以任意命令。

  • 促銷(xiāo)策略可以在任意模塊定義,只需要使用@promotion裝飾器即可。

感謝各位的閱讀!關(guān)于“Python函數(shù)裝飾器的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

網(wǎng)頁(yè)名稱(chēng):Python函數(shù)裝飾器的示例分析
當(dāng)前鏈接:http://bm7419.com/article32/goidpc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、App設(shè)計(jì)、品牌網(wǎng)站制作、服務(wù)器托管、網(wǎng)站建設(shè)、電子商務(wù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化