這篇文章給大家分享的是有關(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ù)裝飾器是一個(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í)行。
若想真正理解裝飾器,需要區(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):
@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í)行了。
在《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)