裝飾器

裝飾器功能秩命,就是在運行原來原代碼功能基礎(chǔ)上尉共,加上些其它功能,比如:
1弃锐、引入日志
2袄友、函數(shù)執(zhí)行時間統(tǒng)計
3、執(zhí)行函數(shù)前預(yù)備處理
4霹菊、執(zhí)行函數(shù)后清理功能
5剧蚣、權(quán)限校驗等場景
6、異常的處理
7、緩存等等鸠按。
不修改原來的代碼礼搁,進(jìn)行功能的擴展。

先明白下面的代碼:

Paste_Image.png

寫代碼要遵循開放封閉原則
封閉:已實現(xiàn)的功能代碼塊
開放:對擴展開發(fā)

雖然在這個原則是用的面向?qū)ο箝_發(fā)目尖,但是也適用于函數(shù)式編程馒吴,簡單來說,它規(guī)定已經(jīng)實現(xiàn)的功能代碼不允許被修改卑雁,但可以被擴展募书。

def w1(func):
    def inner():
        print('驗證1')
        func()
    return inner

@w1
def f1():
    print('f1')

python解釋器就會從上到下解釋代碼,步驟如下:

def w1(func): ==>將w1函數(shù)加載到內(nèi)存.
@w1

沒錯测蹲, 從表面上看解釋器僅僅會解釋這兩句代碼莹捡,因為函數(shù)在沒有被調(diào)用之前其內(nèi)部代碼不會被執(zhí)行。
從表面上看解釋器著實會執(zhí)行這兩句扣甲,但是 @w1 這一句代碼里卻有大文章篮赢, @函數(shù)名是python的一種語法糖。

上例@w1內(nèi)部會執(zhí)行一下操作:
執(zhí)行w1函數(shù)
執(zhí)行w1函數(shù) 琉挖,并將 @w1 下面的函數(shù)作為w1函數(shù)的參數(shù)启泣,即:@w1 等價于 w1(f1) 所以,內(nèi)部就會去執(zhí)行:

def inner(): 
    #驗證 1
    #驗證 2
    #驗證 3
    f1()     # func是參數(shù)示辈,此時 func 等于 f1 

return inner# 返回的 inner寥茫,inner代表的是函數(shù),非執(zhí)行函數(shù) ,其實就是將原來的 f1 函數(shù)塞進(jìn)另外一個函數(shù)中
w1的返回值
將執(zhí)行完的w1函數(shù)返回值 賦值 給@w1下面的函數(shù)的函數(shù)名f1 即將w1的返回值再重新賦值給 f1矾麻,即:

新f1 = def inner(): 
            #驗證 1
            #驗證 2
            #驗證 3
            原來f1()
        return inner

接下來是多個裝飾器的運用

多個裝飾器纱耻,按照從內(nèi)往外(從下往上)先后順序執(zhí)行
為了方便記憶:可以理解為先寫后運行,先寫后結(jié)束

def makeBold(fn):
    print('makeBold...')
    def wrapped():
        return "--1--" + fn() + "--1--"
    return wrapped

def makeItalic(fn):
    print('makeItalic...')
    def wrapped():
        return "--2--" + fn() + "--2--"
    return wrapped

@makeBold
def test1():
    return "hello world-1"

@makeItalic
def test2():
    return "hello world-2"

@makeBold
@makeItalic
def test3():
    return "hello world-3"

print(test1())
print(test2())
print(test3())

運行結(jié)果如下:

makeBold...
makeItalic...
makeItalic...
makeBold...
--1--hello world-1--1--
--2--hello world-2--2--
--1----2--hello world-3--2----1--
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末险耀,一起剝皮案震驚了整個濱河市弄喘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌甩牺,老刑警劉巖蘑志,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異贬派,居然都是意外死亡急但,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門赠群,熙熙樓的掌柜王于貴愁眉苦臉地迎上來羊始,“玉大人,你說我怎么就攤上這事查描⊥晃” “怎么了柏卤?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長匀油。 經(jīng)常有香客問我缘缚,道長,這世上最難降的妖魔是什么敌蚜? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任桥滨,我火速辦了婚禮,結(jié)果婚禮上弛车,老公的妹妹穿的比我還像新娘齐媒。我一直安慰自己,他們只是感情好纷跛,可當(dāng)我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布喻括。 她就那樣靜靜地躺著,像睡著了一般贫奠。 火紅的嫁衣襯著肌膚如雪唬血。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天唤崭,我揣著相機與錄音拷恨,去河邊找鬼。 笑死谢肾,一個胖子當(dāng)著我的面吹牛腕侄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播芦疏,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼兜挨,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了眯分?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤柒桑,失蹤者是張志新(化名)和其女友劉穎弊决,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體魁淳,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡飘诗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了界逛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昆稿。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖息拜,靈堂內(nèi)的尸體忽然破棺而出溉潭,到底是詐尸還是另有隱情净响,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布喳瓣,位于F島的核電站馋贤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏畏陕。R本人自食惡果不足惜配乓,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望惠毁。 院中可真熱鬧犹芹,春花似錦、人聲如沸鞠绰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽洞豁。三九已至盐固,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間丈挟,已是汗流浹背刁卜。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留曙咽,地道東北人蛔趴。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像例朱,于是被迫代替她去往敵國和親孝情。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1.1裝飾器 裝飾器是程序開發(fā)中經(jīng)常會用到的一個功能洒嗤,用好了裝飾器箫荡,開發(fā)效率如虎添翼,所以這也是Python面試中...
    PythonMaO閱讀 481評論 1 5
  • 呵呵渔隶!作為一名教python的老師羔挡,我發(fā)現(xiàn)學(xué)生們基本上一開始很難搞定python的裝飾器,也許因為裝飾器確實很難懂...
    TypingQuietly閱讀 19,552評論 26 186
  • 很多寫裝飾器的都是直接甩給你最終的裝飾器代碼,然后給你說下大致的原理,比如: 然后來上一句,把@log放到now(...
    ztfdeveloper閱讀 311評論 0 0
  • Python的裝飾器的英文名叫Decorator间唉,要對一個已有的模塊做一些“修飾工作”绞灼,所謂修飾工作就是想給現(xiàn)有的...
    Spareribs閱讀 676評論 1 11
  • 本文為《爬著學(xué)Python》系列第四篇文章。從本篇開始呈野,本專欄在順序更新的基礎(chǔ)上低矮,會有不規(guī)則的更新。 在Pytho...
    SyPy閱讀 2,502評論 4 11