摘要:此篇緊接上篇裝飾器裝飾器模式,上篇主要是簡(jiǎn)述了裝飾器模式,跟的裝飾器。再來(lái)看裝飾器的實(shí)現(xiàn)。這時(shí)步輕松搞定裝飾器中的例子還是精妙的。最近學(xué)數(shù)據(jù)結(jié)構(gòu)與算法,寫(xiě)些裝飾器用來(lái)看程序執(zhí)行時(shí)間,真是再方便不過(guò)了
此篇緊接上篇 Python裝飾器vs裝飾器模式,上篇主要是簡(jiǎn)述了裝飾器模式,跟Python的裝飾器。
再來(lái)看Python裝飾器的實(shí)現(xiàn)。這里我推薦一篇文章(譯)-12步輕松搞定python裝飾器,文章寫(xiě)得非常不錯(cuò),看完后對(duì)作用于,閉包都感受非常深,但是我覺(jué)得漏了一些點(diǎn)點(diǎn),我把我的想法闡述在本文
補(bǔ)全根據(jù)Java實(shí)現(xiàn)裝飾器模式的,我們可以寫(xiě)下面一段代碼:
import logging def use_logging(func): logging.warn("%s is running" % func.__name__) return func def foo(): print("i am foo") foo = use_logging(foo) foo() # 調(diào)用
這個(gè)實(shí)現(xiàn)對(duì)于上篇文章中提到的Java使用裝飾器。上面也是一個(gè)裝飾器,實(shí)現(xiàn)最簡(jiǎn)單的一個(gè)增加函數(shù)日志的功能,但是如果這個(gè)額外功能是要去檢測(cè)傳入的參數(shù)時(shí),這時(shí)上面的就不行了。這時(shí)12步輕松搞定python裝飾器中的例子還是精妙的。
# 裝飾器 def wrapper(func): def checker(a, b): # 1 if a.x < 0 or a.y < 0: a = Coordinate(a.x if a.x > 0 else 0, a.y if a.y > 0 else 0) if b.x < 0 or b.y < 0: b = Coordinate(b.x if b.x > 0 else 0, b.y if b.y > 0 else 0) ret = func(a, b) if ret.x < 0 or ret.y < 0: ret = Coordinate(ret.x if ret.x > 0 else 0, ret.y if ret.y > 0 else 0) return ret return checker # 原函數(shù) def add(a, b): return Coordinate(a.x + b.x, a.y + b.y) # 使用裝飾 add = wrapper(add)
細(xì)心你會(huì)發(fā)現(xiàn),裝飾器函數(shù)的參數(shù)就是傳入的原函數(shù),而內(nèi)部函數(shù)的參數(shù)跟原函數(shù)一模一樣,最外層返回的是內(nèi)部函數(shù)的引用,內(nèi)部函數(shù)返回的是傳入?yún)?shù)的引用調(diào)用的結(jié)果
這里用到了函數(shù)作為參數(shù)特性,當(dāng)然還有些閉包的知識(shí),具體請(qǐng)看 上面提到的博客鏈接,真的講的不錯(cuò)。
而上篇說(shuō)到的Python裝飾 特性就是這個(gè)神奇的語(yǔ)法糖了,可以這樣使用
# 原函數(shù) @wrapper def add(a, b): return Coordinate(a.x + b.x, a.y + b.y)帶參數(shù)的裝飾器
如果要實(shí)現(xiàn)一個(gè)帶參數(shù)的裝飾器,那要怎么寫(xiě)呢
def time_diff(s): def decorator(func): def wrapper(*args, **kwargs): start_time = time.time() res = func(*args, **kwargs) end_time = time.time() print("[%s]執(zhí)行程序所用時(shí)間: %s" % (s, end_time - start_time)) return res return wrapper return decorator @time_diff("polynomial_1") def polynomial_1(n, x): res = 0 for i in range(n): res += i*pow(x, i) return res
調(diào)用并執(zhí)行輸出結(jié)果:
print(polynomial_1(1, 5)) [duoxiangshi_1]執(zhí)行程序所用時(shí)間: 4.76837158203125e-06 0
帶參數(shù)的裝飾器需要在不帶參數(shù)裝飾器外再定義一層函數(shù),最外層函數(shù)的返回值是第二層函數(shù)的引用。
總結(jié):多些多練,用于實(shí)際中,才能更加熟練。最近學(xué)數(shù)據(jù)結(jié)構(gòu)與算法,寫(xiě)些裝飾器用來(lái)看程序執(zhí)行時(shí)間,真是再方便不過(guò)了!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/41787.html
摘要:裝飾器的使用符合了面向?qū)ο缶幊痰拈_(kāi)放封閉原則。三簡(jiǎn)單的裝飾器基于上面的函數(shù)執(zhí)行時(shí)間的需求,我們就手寫(xiě)一個(gè)簡(jiǎn)單的裝飾器進(jìn)行實(shí)現(xiàn)。函數(shù)體就是要實(shí)現(xiàn)裝飾器的內(nèi)容。類(lèi)裝飾器的實(shí)現(xiàn)是調(diào)用了類(lèi)里面的函數(shù)。類(lèi)裝飾器的寫(xiě)法比我們裝飾器函數(shù)的寫(xiě)法更加簡(jiǎn)單。 目錄 前言 一、什么是裝飾器 二、為什么要用裝飾器 ...
摘要:希望引以為戒鄭傳裝飾模式如果你了解,你肯定聽(tīng)過(guò)裝飾器模式。在面向?qū)ο笾?,裝飾模式指動(dòng)態(tài)地給一個(gè)對(duì)象添加一些額外的職責(zé)。就增加一些功能來(lái)說(shuō),裝飾模式比生成子類(lèi)更為靈活。 漫談 如果作為一個(gè)Python入門(mén),不了解Python裝飾器也沒(méi)什么,但是如果作為一個(gè)中級(jí)Python開(kāi)發(fā)人員,如果再不對(duì)python裝飾器熟稔于心的話(huà),那么可能并沒(méi)有量變積累到質(zhì)變。 我以前也看過(guò)很多講python 裝...
摘要:一般情況下,我們使用裝飾器提供的語(yǔ)法糖,來(lái)簡(jiǎn)化上面的寫(xiě)法像上面的情況,可以動(dòng)態(tài)修改函數(shù)或類(lèi)功能的函數(shù)就是裝飾器。本文標(biāo)題為會(huì)打扮的裝飾器本文鏈接為參考資料修飾器的函數(shù)式編程中的裝飾器介紹思誠(chéng)之道裝飾器入門(mén)與提高賴(lài)明星 裝飾器 我們知道,在 Python 中,我們可以像使用變量一樣使用函數(shù): 函數(shù)可以被賦值給其他變量 函數(shù)可以被刪除 可以在函數(shù)里面再定義函數(shù) 函數(shù)可以作為參數(shù)傳遞給另外...
摘要:一引用書(shū)流暢的書(shū)二基本概念問(wèn)題裝飾器是什么解答嚴(yán)格來(lái)說(shuō),裝飾器只是語(yǔ)法糖,裝飾器是可調(diào)用的對(duì)象,可以像常規(guī)的可調(diào)用對(duì)象那樣調(diào)用,特殊的地方是裝飾器的參數(shù)是一個(gè)函數(shù)問(wèn)題裝飾器有什么特性解答裝飾器有個(gè)特性,一是可以把被裝飾的函數(shù)替換成其他函數(shù), 一, 引用 [書(shū)] 流暢的Python [書(shū)] Effective Python 二, 基本概念 showImg(https://segme...
摘要:初步認(rèn)識(shí)裝飾器函數(shù)裝飾器用于在源代碼中標(biāo)記函數(shù),以某種方式增強(qiáng)函數(shù)的行為。函數(shù)裝飾器在導(dǎo)入模塊時(shí)立即執(zhí)行,而被裝飾的函數(shù)只在明確調(diào)用時(shí)運(yùn)行。只有涉及嵌套函數(shù)時(shí)才有閉包問(wèn)題。如果想保留函數(shù)原本的屬性,可以使用標(biāo)準(zhǔn)庫(kù)中的裝飾器。 《流暢的Python》筆記本篇將從最簡(jiǎn)單的裝飾器開(kāi)始,逐漸深入到閉包的概念,然后實(shí)現(xiàn)參數(shù)化裝飾器,最后介紹標(biāo)準(zhǔn)庫(kù)中常用的裝飾器。 1. 初步認(rèn)識(shí)裝飾器 函數(shù)裝飾...
摘要:變量查找規(guī)則在中一個(gè)變量的查找順序是局部環(huán)境,閉包,全局,內(nèi)建閉包引用了自由變量的函數(shù)。閉包的作用閉包的最大特點(diǎn)是可以將父函數(shù)的變量與內(nèi)部函數(shù)綁定,并返回綁定變量后的函數(shù),此時(shí)即便生成閉包的環(huán)境父函數(shù)已經(jīng)釋放,閉包仍然存在。 導(dǎo)語(yǔ):本文章記錄了本人在學(xué)習(xí)Python基礎(chǔ)之函數(shù)篇的重點(diǎn)知識(shí)及個(gè)人心得,打算入門(mén)Python的朋友們可以來(lái)一起學(xué)習(xí)并交流。 本文重點(diǎn): 1、掌握裝飾器的本質(zhì)、功...
閱讀 3199·2021-11-10 11:35
閱讀 1305·2019-08-30 13:20
閱讀 1126·2019-08-29 16:18
閱讀 2141·2019-08-26 13:54
閱讀 2166·2019-08-26 13:50
閱讀 966·2019-08-26 13:39
閱讀 2483·2019-08-26 12:08
閱讀 1959·2019-08-26 10:37