裝飾器

一沥邻、函數(shù)傳參

def t1():
    print "t1"

def t2(func):
    print func     # <function t1 at 0x10aae2668>
    func()         # 輸出t1
    print "t2"     # 輸出t2

t2(t1)

二、如果每個(gè)函數(shù)都需要同一個(gè)功能

def log(func):
    print "logging ..."
    func()

def foo():
    print "this is foo"

def bar():
    print "this is bar"

log(bar)   
#在實(shí)際函數(shù)外包裹一個(gè)功能函數(shù)羊娃,破壞了代碼結(jié)構(gòu)唐全,很復(fù)雜

三、裝飾器實(shí)現(xiàn)

def log(func):
    def wrapper():
        print "logging ..."
        func()
    return wrapper

@log
def foo():
    print "this is foo"

@log
def bar():
    print "this is bar"

bar()    #先進(jìn)入log函數(shù)蕊玷,返回wrapper時(shí)進(jìn)入wrapper執(zhí)行print芦瘾,執(zhí)行func函數(shù)
foo()

四、被裝飾函數(shù)有參數(shù)情況

def log(func):
    def wrapper(*args):
        print "logging ..."
        func(*args)
    return wrapper

@log
def foo(name,age):
    print "this is %s" %name
    print "he is %d" %age


foo("abc",99)

####################################################
def log(func):
    def wrapper(*args, **kwargs):
        # args是一個(gè)參數(shù)數(shù)組集畅,kwargs一個(gè)關(guān)鍵字字典
        print "logging ..."
        func(*args, **kwargs)
    return wrapper

@log
def foo(*args, **kwargs):
    for arg in args:
        print arg

    for k, v in kwargs.items():
        print k, v


foo(1,2,3,name='abc',age=99)

五近弟、帶參數(shù)的裝飾器

def log(level):
    def decorator(func):
        def wrapper(**kwargs):
            if level==1:
                print "logging level = 1..."
            else:
                print "logging level != 1..."
            func(**kwargs)
        return wrapper
    return decorator

@log(level=2)
def foo(**kwargs):
    print "this is %s" % kwargs['name']
    print "he is %d" % kwargs['age']


foo(name='abc', age=99)

六、類(lèi)裝飾器

主要通過(guò)call函數(shù)進(jìn)行調(diào)用

class Log():
    def __init__(self,func):
        self.func=func

    def __call__(self, **kwargs):
        print "logging use decorator class"
        self.func(**kwargs)
        print "decorator class end"

@Log
def foo(**kwargs):
    print "this is %s" % kwargs['name']
    print "he is %d" % kwargs['age']


foo(name='abc', age=99)

七挺智、多個(gè)裝飾器

def a(func):
    def wrapper():
        print "aaaa"
        return func()
    return wrapper

def b(func):
    def wrapper():
        print "bbbb"
        return func()
    return wrapper

def c(func):
    def wrapper():
        print "cccc"
        return func()
    return wrapper

@a
@b
@c
def foo():
    print "this is foo"


foo()  # 先a祷愉,再b,再c赦颇,再foo

其他:裝飾器簡(jiǎn)單實(shí)例

#coding:utf-8

import time
"""
裝飾器器:先進(jìn)入裝飾器器二鳄,func就是now函數(shù)
"""
def log1(func):
    def wrapper(*args, **kw):
        print "call,",func.__name__
        func()
    return wrapper
#log1:返回wrapper時(shí),進(jìn)入wrapper媒怯,執(zhí)行print订讼,然后執(zhí)行func
#>>> call,now
#>>> 152.....

def log2(func):
    def wrapper(*args, **kw):
        print "call,",func.__name__
    func()
    return wrapper
#log2:先執(zhí)行func,再在返回wrapper時(shí)扇苞,進(jìn)入wrapper欺殿,執(zhí)行print
#>>> 152.....
#>>> call,now

@log1
def now():
    print time.time()

now()
# 本質(zhì)上 log1(now)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末寄纵,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子脖苏,更是在濱河造成了極大的恐慌程拭,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件棍潘,死亡現(xiàn)場(chǎng)離奇詭異恃鞋,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)亦歉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)恤浪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人肴楷,你說(shuō)我怎么就攤上這事资锰。” “怎么了阶祭?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵绷杜,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我濒募,道長(zhǎng)鞭盟,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任瑰剃,我火速辦了婚禮齿诉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘晌姚。我一直安慰自己粤剧,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布挥唠。 她就那樣靜靜地躺著抵恋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪宝磨。 梳的紋絲不亂的頭發(fā)上弧关,一...
    開(kāi)封第一講書(shū)人閱讀 49,829評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音唤锉,去河邊找鬼世囊。 笑死,一個(gè)胖子當(dāng)著我的面吹牛窿祥,可吹牛的內(nèi)容都是我干的株憾。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼晒衩,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼嗤瞎!你這毒婦竟也來(lái)了墙歪?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤猫胁,失蹤者是張志新(化名)和其女友劉穎箱亿,沒(méi)想到半個(gè)月后跛锌,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體弃秆,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年髓帽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了菠赚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡郑藏,死狀恐怖衡查,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情必盖,我是刑警寧澤拌牲,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站歌粥,受9級(jí)特大地震影響塌忽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜失驶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一土居、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧嬉探,春花似錦擦耀、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至胎围,卻和暖如春账磺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背痊远。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工垮抗, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人碧聪。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓冒版,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親逞姿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子辞嗡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

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

  • 在學(xué)習(xí) Python 的時(shí)候续室,慶幸自己有 JavaScript 的基礎(chǔ)栋烤,在學(xué)習(xí)過(guò)程中,發(fā)現(xiàn)許多相似的地方挺狰,如導(dǎo)包的...
    柏丘君閱讀 1,199評(píng)論 2 8
  • 本文為《爬著學(xué)Python》系列第四篇文章明郭。從本篇開(kāi)始,本專(zhuān)欄在順序更新的基礎(chǔ)上丰泊,會(huì)有不規(guī)則的更新薯定。 在Pytho...
    SyPy閱讀 2,493評(píng)論 4 11
  • 概念 python有兩種裝飾器: 函數(shù)裝飾器(function decorators) 類(lèi)裝飾器(class de...
    drfung閱讀 645評(píng)論 1 7
  • 序列與非序列模型 在ZEMAX的序列模型中,所有光線傳播發(fā)生在特定局部坐標(biāo)系中的光學(xué)面瞳购。大多數(shù)成像系統(tǒng)可以很好地用...
    漁山樵水閱讀 13,023評(píng)論 0 3
  • 醒了话侄,醒了也睡著,迷迷糊糊中分不清什么是真的什么是假的学赛,其實(shí)我知道年堆,但我不愿意說(shuō)。 癱著盏浇,好像個(gè)廢人变丧,又想要極力去...
    Atia十點(diǎn)睡姑娘閱讀 154評(píng)論 0 0