Python裝飾器——提高

上一篇文章我們對(duì)裝飾器有了初步了解拳缠,接下來(lái)開始是對(duì)裝飾器的進(jìn)一步實(shí)踐

1.少了元信息怎么辦

當(dāng)你寫了一個(gè)裝飾器作用在某個(gè)函數(shù)上,但是這個(gè)函數(shù)的重要的元信息比如名字惜纸、文檔字符串套硼、注解和參數(shù)簽名都丟失了兵钮。這到底是怎樣的一種現(xiàn)象呢?直接上代碼吧钠右。

# -*- coding:UTF-8 -*- 
def show_me(func):
    def wrapper():
        print "It is in wrapper."
        func()
    return wrapper

@show_me
def func1():
    '''
    this is func1
    '''
    print "running func1"

if __name__ == '__main__':
    func1()
    print func1.__name__
    print func1.__doc__

打印結(jié)果:


元數(shù)據(jù)

我們可以看到func1.__name__輸出為wrapper赋元,func1.__doc__輸出為None,哇飒房,全亂套了搁凸,怎么辦。不要怕狠毯,Python大法自有辦法护糖。

溫馨提醒:任何時(shí)候你定義裝飾器的時(shí)候,都應(yīng)該使用 functools 庫(kù)中的 @wraps 裝飾器來(lái)注解底層包裝函數(shù)。

也就是說(shuō)嚼松,裝飾器函數(shù)應(yīng)該這樣做補(bǔ)充:

from functools import wraps ##導(dǎo)入這個(gè)包

def show_me(func):
    @wraps(func)
    def wrapper():
        print "It is in wrapper."
        func()
    return wrapper

加上這個(gè)后嫡良,你可以再運(yùn)行一下,應(yīng)該會(huì)得到完整的元數(shù)據(jù).

2.被裝飾函數(shù)有參數(shù)

我們可以看到献酗,上文的被裝飾函數(shù)(也就是func函數(shù))是沒(méi)有參數(shù)的寝受,但是在實(shí)際應(yīng)用中,我們大多數(shù)的函數(shù)都會(huì)有參數(shù)罕偎,這就要用到Python中的可變參數(shù)了很澄。那么對(duì)于被裝飾函數(shù)帶有參數(shù)的裝飾器該怎么寫呢,可見如下代碼:

# -*- coding:UTF-8 -*- 
from functools import wraps

def show_me(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        print "強(qiáng)哥好帥!"
        return func(*args, **kwargs)
    return wrapper

@show_me
def func4(a, b=2):
    print "a = %s"%a
    print "b = %s"%b


if __name__ == '__main__':
    func4(3, 8)

運(yùn)行結(jié)果如下:

>>強(qiáng)哥好帥!
>>a = 3
>>b = 8

可變參數(shù)是個(gè)好東西,在Python中(星號(hào))*和參數(shù)有許多有趣的用法甩苛,值得一看忙干。

3.裝飾器帶有參數(shù)

有時(shí)候,@語(yǔ)法糖后面還可以帶參數(shù)浪藻。比如某個(gè)函數(shù)功能只有擁有經(jīng)理權(quán)限的人才能訪問(wèn)∏瑁可以編寫這樣的一個(gè)裝飾器@has_permission("manager"),下面來(lái)舉一個(gè)簡(jiǎn)單粗魯?shù)睦踝樱?/p>

# -*- coding:UTF-8 -*- 
from functools import wraps

def has_permission(position=""):
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            if position == "manager":
                print "我是經(jīng)理我怕誰(shuí)!"
                return func(*args, **kwargs)
            else:
                print "You don not have permission to access!"
        return wrapper
    return decorator

@has_permission(position="manager")
def func5(name=""):
    print "My name is : %s"%name

if __name__ == '__main__':
    func5("zhujq")

結(jié)果為:

>>我是經(jīng)理我怕誰(shuí)!
>>My name is : zhujq

當(dāng)position改為其他時(shí)(比如“Boss”)皂甘,程序便只能輸出:

 You don not have permission to access!
4.其他

Python還提供了類裝飾器與@staticmethod嗡官,@classmethod@property和這三個(gè)在面向?qū)ο缶幊讨谐S玫难b飾器,我們下次再講吧~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末诱桂,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子颊咬,更是在濱河造成了極大的恐慌万伤,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件月劈,死亡現(xiàn)場(chǎng)離奇詭異度迂,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)猜揪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門惭墓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人而姐,你說(shuō)我怎么就攤上這事腊凶。” “怎么了拴念?”我有些...
    開封第一講書人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵钧萍,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我政鼠,道長(zhǎng)风瘦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任公般,我火速辦了婚禮弛秋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘俐载。我一直安慰自己蟹略,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開白布遏佣。 她就那樣靜靜地躺著挖炬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪状婶。 梳的紋絲不亂的頭發(fā)上意敛,一...
    開封第一講書人閱讀 51,708評(píng)論 1 305
  • 那天馅巷,我揣著相機(jī)與錄音,去河邊找鬼草姻。 笑死钓猬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的撩独。 我是一名探鬼主播敞曹,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼综膀!你這毒婦竟也來(lái)了澳迫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤剧劝,失蹤者是張志新(化名)和其女友劉穎橄登,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體讥此,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拢锹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了萄喳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片面褐。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖取胎,靈堂內(nèi)的尸體忽然破棺而出展哭,到底是詐尸還是另有隱情,我是刑警寧澤闻蛀,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布匪傍,位于F島的核電站,受9級(jí)特大地震影響觉痛,放射性物質(zhì)發(fā)生泄漏役衡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一薪棒、第九天 我趴在偏房一處隱蔽的房頂上張望手蝎。 院中可真熱鬧,春花似錦俐芯、人聲如沸棵介。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)邮辽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吨述,已是汗流浹背岩睁。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留揣云,地道東北人捕儒。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像邓夕,于是被迫代替她去往敵國(guó)和親刘莹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

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

  • 本文為《爬著學(xué)Python》系列第四篇文章翎迁。從本篇開始,本專欄在順序更新的基礎(chǔ)上净薛,會(huì)有不規(guī)則的更新汪榔。 在Pytho...
    SyPy閱讀 2,503評(píng)論 4 11
  • 前言 人生苦多,快來(lái) Kotlin 肃拜,快速學(xué)習(xí)Kotlin痴腌! 什么是Kotlin? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,211評(píng)論 9 118
  • 假以時(shí)日燃领,我相信裝飾器一定會(huì)成為Python這門編程語(yǔ)言一個(gè)更加強(qiáng)大的功能士聪。到目前為止,我覺(jué)得到我所看到的有關(guān)介紹...
    TypingQuietly閱讀 5,437評(píng)論 2 71
  • 本文為《爬著學(xué)Python》系列第十篇文章猛蔽。 在實(shí)際操作中剥悟,可能函數(shù)是我們幾乎唯一的實(shí)現(xiàn)操作的方式,這是因?yàn)楹瘮?shù)能...
    SyPy閱讀 5,465評(píng)論 0 8
  • 提到中國(guó)古代詩(shī)歌曼库,大家便會(huì)首提唐詩(shī)宋詞区岗。過(guò)去的三天時(shí)間里跟大家講完了唐詩(shī),怎么說(shuō)也略不過(guò)宋詞了毁枯。 宋詞慈缔,這個(gè)可以與...
    愛(ài)在夏末秋初閱讀 398評(píng)論 0 5