Python的裝飾器原來(lái)是這么用的

Python的裝飾器目养,是一個(gè)Python中一個(gè)比較難以理解的知識(shí)點(diǎn), 今天我試試說(shuō)一說(shuō)毒嫡,說(shuō)的如果不好癌蚁,請(qǐng)見(jiàn)諒。

裝飾器兜畸,從字面意思來(lái)說(shuō)努释,就是修飾一個(gè)事物的,在Python里面的作用就是讓一個(gè)已經(jīng)存在的函數(shù)擁有一個(gè)以前沒(méi)有的功能膳叨。裝飾器本質(zhì)上還是一個(gè)函數(shù)洽洁,知識(shí)他的功能是為其他函數(shù)添加新功能。

那有人會(huì)說(shuō)菲嘴,我在原來(lái)的函數(shù)里面加一些代碼饿自,也可以實(shí)現(xiàn)啊,為什么還要搞個(gè)裝飾器來(lái)增加功能呢龄坪? 當(dāng)然昭雌,如果你給一個(gè)函數(shù)加個(gè)功能,是可以加代碼健田, 但是如果是讓你給100個(gè)函數(shù)代碼塊加一個(gè)相同的功能呢烛卧? 一個(gè)個(gè)改代碼嗎? 你會(huì)奔潰的妓局。

下面說(shuō)說(shuō)一個(gè)裝飾器要實(shí)現(xiàn)总放,要符合一定的規(guī)則,就是兩個(gè)不改動(dòng)
1.不改動(dòng)被裝飾函數(shù)的源代碼
2.不改動(dòng)被修飾函數(shù)的調(diào)用方式

就是你加沒(méi)加這個(gè)裝飾器好爬,函數(shù)要按照原樣來(lái)調(diào)用

下面說(shuō)說(shuō)裝飾器到底怎么寫局雄,怎么用,上面說(shuō)到裝飾器也是一個(gè)函數(shù)存炮,但是這個(gè)函數(shù)和普通的函數(shù)不太一樣炬搭,他是一個(gè)高階函數(shù)蜈漓,那我們給裝飾器大概下個(gè)定義

裝飾器:一個(gè)可以給別的函數(shù)添加新功能的高階函數(shù)(當(dāng)然現(xiàn)在還是不完整的定義)

下面介紹下什么是高階函數(shù)。

高階函數(shù): 一個(gè)可以接受函數(shù)為參數(shù)或者能reture 一個(gè)函數(shù)的函數(shù)就是高階函數(shù)

是不是有點(diǎn)繞宫盔,舉個(gè)例子

def f1():  
    print('普通函數(shù)')

def f2(func):  #f2函數(shù)的參數(shù)是一個(gè)函數(shù)融虽,所以它是一個(gè)高階函數(shù)
    print('高階函數(shù)1')
    f1()

def f3(func): #f3函數(shù)的返回值是一個(gè)函數(shù),所以它是一個(gè)高階函數(shù)
    print('高階函數(shù)2')
    return func

f2(f1)
f3(f1)

結(jié)果:
高階函數(shù)1
普通函數(shù)
高階函數(shù)2

有點(diǎn)基礎(chǔ)的人可能知道灼芭,這個(gè)根本就不是裝飾器有额,騙人的。當(dāng)然裝飾器不是這么簡(jiǎn)單姿鸿。

那下面要介紹的一個(gè)東西叫嵌套函數(shù)谆吴,那什么叫嵌套函數(shù)呢? 字面意思應(yīng)該就知道了苛预,函數(shù)里面套一個(gè)子函數(shù)

舉個(gè)例子:

def outer():
    print('outer')
    def inner():
        print('inner')
    inner()
outer()

結(jié)果
outer
inner

下面我們要給裝飾器重新下個(gè)定義了句狼。

裝飾器:一個(gè)可以給別的函數(shù)添加新功能的高階函數(shù)+嵌套函數(shù)

那么我們把高階函數(shù)+嵌套函數(shù)結(jié)合在一起看看

一個(gè)可以添加一行日志的裝飾器

def add_log(func):  #一個(gè)函數(shù)作為參數(shù),這個(gè)函數(shù)就是我們要
    def wrapper():
        print('我們要加一些日志') #要給原函數(shù)添加的新功能热某,這里就是打印一行日志腻菇,當(dāng)然可以實(shí)現(xiàn)其他復(fù)雜的功能
        func()
    return wrapper

#上面可以看到高階函數(shù)+嵌套函數(shù)的影子吧,加一起就是一個(gè)最簡(jiǎn)單的裝飾器拉

@add_log  #裝飾器的用法
def f1():
    print('普通函數(shù)')

f1()  #調(diào)用函數(shù)

結(jié)果:
#看結(jié)果f1里面只有print一行昔馋,但是結(jié)果多了一行筹吐,就是裝飾器的作用
我們要加一些日志
普通函數(shù)

這些裝飾器大概知道上面意思了吧。

下面說(shuō)說(shuō)秘遏,上面的裝飾器丘薛,有沒(méi)有沒(méi)有上面問(wèn)題呢?

看看邦危,仔細(xì)看看洋侨。 看出來(lái)了嗎? 看不出來(lái)倦蚪,我說(shuō)了哦希坚。

上面我們的f1()函數(shù), 沒(méi)有參數(shù)陵且,是不是裁僧,想想如果f1()函數(shù)要加參數(shù)怎么辦啊慕购?

def add_log(func):
    def wrapper(name):
        print('我們要加一些日志')
        func(name)
    return wrapper

@add_log
def f1(name):
    print('普通函數(shù) %s' %name)

f1('python')

有人是不是想這樣實(shí)現(xiàn)呢聊疲?

當(dāng)然這樣是可以的,但是我們不要忘了裝飾器的作用沪悲,他不是給某一個(gè)固定的函數(shù)來(lái)使用的售睹,假如現(xiàn)在還需要修飾一個(gè)f2(name,age), 那怎么辦啊可训? 沒(méi)辦法昌妹,裝飾器的代碼都給你定死了,所以上面這樣寫是不行的握截。

到底怎么寫呢飞崖?

def add_log(func):
    def wrapper(*args,**kwargs):
        print('我們要加一些日志')
        func(*args,**kwargs)
    return wrapper

@add_log
def f1(name):
    print('普通函數(shù) %s' %name)

@add_log
def f2(name,age):
    print('我是%s,我%s歲了' %(name,age))

f1('python')
f2('java',10)

結(jié)果:
我們要加一些日志
普通函數(shù) python
我們要加一些日志
我是java,我10歲了

上面的寫法,是不是可以了谨胞,是不是固歪,不管任何函數(shù),任何參數(shù)胯努,都OK了牢裳,至于args,*kwargs啥意思,大家可以去百度下啊叶沛。這里就不多說(shuō)了

今天就說(shuō)這么多蒲讯,希望大家對(duì)于python的裝飾器有個(gè)基本的了解。

這里留個(gè)彩蛋灰署,上面的最終的代碼判帮,你覺(jué)得還有問(wèn)題嗎?仔細(xì)看溉箕,如果能看出來(lái)歡迎給我留言晦墙,如何看不出來(lái),看我下回分解肴茄。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末晌畅,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子寡痰,更是在濱河造成了極大的恐慌抗楔,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件氓癌,死亡現(xiàn)場(chǎng)離奇詭異谓谦,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)贪婉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門反粥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人疲迂,你說(shuō)我怎么就攤上這事才顿。” “怎么了尤蒿?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵郑气,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我腰池,道長(zhǎng)尾组,這世上最難降的妖魔是什么忙芒? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮讳侨,結(jié)果婚禮上呵萨,老公的妹妹穿的比我還像新娘。我一直安慰自己跨跨,他們只是感情好潮峦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著勇婴,像睡著了一般忱嘹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上耕渴,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天拘悦,我揣著相機(jī)與錄音,去河邊找鬼萨螺。 笑死窄做,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的慰技。 我是一名探鬼主播椭盏,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼吻商!你這毒婦竟也來(lái)了掏颊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤艾帐,失蹤者是張志新(化名)和其女友劉穎乌叶,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體柒爸,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡准浴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了捎稚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乐横。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖今野,靈堂內(nèi)的尸體忽然破棺而出葡公,到底是詐尸還是另有隱情,我是刑警寧澤条霜,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布催什,位于F島的核電站,受9級(jí)特大地震影響宰睡,放射性物質(zhì)發(fā)生泄漏蒲凶。R本人自食惡果不足惜气筋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望豹爹。 院中可真熱鬧裆悄,春花似錦、人聲如沸臂聋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)孩等。三九已至,卻和暖如春采够,著一層夾襖步出監(jiān)牢的瞬間肄方,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工蹬癌, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留权她,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓逝薪,卻偏偏與公主長(zhǎng)得像隅要,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子董济,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

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

  • 部分細(xì)節(jié)自己改了點(diǎn)步清,也加了點(diǎn)自己例子,基本上屬于轉(zhuǎn)載虏肾。轉(zhuǎn)載出處:https://my.oschina.net/le...
    洛克黃瓜閱讀 1,974評(píng)論 0 3
  • 在學(xué)習(xí)Python的過(guò)程中廓啊,我相信有很多人和我一樣,對(duì)Python的裝飾器一直覺(jué)得很困惑封豪,我也是困惑了好久谴轮,并通過(guò)...
    lijincheng閱讀 5,910評(píng)論 0 5
  • 要點(diǎn): 函數(shù)式編程:注意不是“函數(shù)編程”,多了一個(gè)“式” 模塊:如何使用模塊 面向?qū)ο缶幊蹋好嫦驅(qū)ο蟮母拍畲挡骸傩浴?..
    victorsungo閱讀 1,495評(píng)論 0 6
  • 在學(xué)習(xí)Python的過(guò)程中第步,我相信有很多人和我一樣,對(duì)Python的裝飾器一直覺(jué)得很困惑藻雌,我也是困惑了好久雌续,并通過(guò)...
    愚灬墨閱讀 460評(píng)論 1 1
  • 轉(zhuǎn)載來(lái)自:http://blog.csdn.net/u013471155 在學(xué)習(xí)Python的過(guò)程中,我相信有很多...
    JM68閱讀 576評(píng)論 3 9