Python裝飾器的一些小知識(shí)

調(diào)用時(shí)機(jī)

裝飾器的調(diào)用時(shí)機(jī)是在導(dǎo)入時(shí),或者是加載時(shí)就執(zhí)行泉懦,如下代碼:

register = []


def regester(func):
    print 'running regisster ({0})'.format(func)
    register.append(func)
    return func


@regester
def f1():
    print "running f1()"


@regester
def f2():
    print "running f2()"


def f3():
    print "running f3()"


def main():
    print "running main()"
    print register
    f1()
    f2()
    f3()

其執(zhí)行結(jié)果如下:

running regisster (<function f1 at 0x1035ae5f0>)
running regisster (<function f2 at 0x1035ae668>)
running main()
[<function f1 at 0x1035ae5f0>, <function f2 at 0x1035ae668>]
running f1()
running f2()
running f3()

按照正常的代碼執(zhí)行邏輯要執(zhí)行,那么第一個(gè)打印出來的應(yīng)該是"running main()",但是實(shí)際上在第三行才打出來了籽懦,前面兩行都是裝飾器里面的內(nèi)容,用Debug模式來運(yùn)行氛魁,看的比較清楚暮顺。

image

如圖所示,我在運(yùn)行初識(shí)的時(shí)候打了一個(gè)端點(diǎn)秀存,Debug模式運(yùn)行后捶码,程序已經(jīng)打印出了裝飾器的內(nèi)容。

------以上來自《流暢的Python》

裝飾器來打日志

之前一直有用過這塊或链,不過遇到了一點(diǎn)問題惫恼,在修飾類里面的函數(shù)時(shí),經(jīng)常會(huì)出現(xiàn)參數(shù)錯(cuò)誤的情況澳盐,因?yàn)轭惱锩娴暮瘮?shù)第一個(gè)參數(shù)總是self祈纯,在執(zhí)行的時(shí)候經(jīng)常保參數(shù)不正確,這里分享一個(gè)我實(shí)踐成功的一個(gè)裝飾器函數(shù)叼耙,可以解決這個(gè)問題腕窥。

# ecoding=utf-8
# Author: 翁彥彬 | Sven_Weng
# Email : sven_weng@wengyb.com
# Web   : http://wybblog.applinzi.com
import time
import functools


def log(func):
    @functools.wraps(func)
    def inner_methods(*args, **kwargs):
        t0 = time.time()
        result = func(*args, **kwargs)
        t1 = time.time()
        name = func.__name__
        arg_list = []
        if args:
            arg_list.append(', '.join([str(arg) for arg in args]))
        if kwargs:
            pairs = ['{0}={1}'.format(k, w) for k, w in sorted(kwargs.items())]
            arg_list.append(', '.join(pairs))
        print "[{0}]func_name:{1},args:({2})".format(str(t1 - t0), name, arg_list)
        return result

    return inner_methods

這個(gè)裝飾器裝飾之后,會(huì)把執(zhí)行的函數(shù)名筛婉,入?yún)⒑蛨?zhí)行的時(shí)間全部都打出來油昂。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子冕碟,更是在濱河造成了極大的恐慌拦惋,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件安寺,死亡現(xiàn)場(chǎng)離奇詭異厕妖,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)挑庶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門言秸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人迎捺,你說我怎么就攤上這事举畸。” “怎么了凳枝?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵抄沮,是天一觀的道長。 經(jīng)常有香客問我岖瑰,道長叛买,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任蹋订,我火速辦了婚禮率挣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘露戒。我一直安慰自己椒功,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布智什。 她就那樣靜靜地躺著动漾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪撩鹿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天悦屏,我揣著相機(jī)與錄音节沦,去河邊找鬼。 笑死础爬,一個(gè)胖子當(dāng)著我的面吹牛甫贯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播看蚜,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼叫搁,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起渴逻,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤疾党,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后惨奕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體雪位,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年梨撞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了雹洗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡卧波,死狀恐怖时肿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情港粱,我是刑警寧澤螃成,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站啥容,受9級(jí)特大地震影響锈颗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜咪惠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一击吱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧遥昧,春花似錦覆醇、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鞋仍,卻和暖如春常摧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背威创。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來泰國打工落午, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人肚豺。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓溃斋,卻偏偏與公主長得像,于是被迫代替她去往敵國和親吸申。 傳聞我的和親對(duì)象是個(gè)殘疾皇子梗劫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355