裝飾器(decorators)

裝飾器是這樣一種設計模式:如果一個類希望添加其他類的一些功能,而不希望通過繼承或是直接修改源代碼實現(xiàn),那么可以使用裝飾器模式。簡單來說Python中的裝飾器就是指某些函數(shù)或其他可調(diào)用對象,以函數(shù)或類作為可選輸入?yún)?shù)梧田,然后返回函數(shù)或類的形式。通過這個在Python2.6版本中被新加入的特性可以用來實現(xiàn)裝飾器設計模式侧蘸。

順便提一句裁眯,在繼續(xù)閱讀之前,如果你對Python中的閉包(Closure)概念不清楚闺魏,可以參考博文:http://www.cnblogs.com/vamei/archive/2012/12/15/2772451.html

在Python中,裝飾器被用于用@語法糖修辭的函數(shù)或類「┗現(xiàn)在讓我們用一個簡單的裝飾器例子來演示如何做一個函數(shù)調(diào)用日志記錄器析桥。在這個例子中,裝飾器將時間格式作為輸入?yún)?shù)艰垂,在調(diào)用被這個裝飾器裝飾的函數(shù)時打印出函數(shù)調(diào)用的時間泡仗。這個裝飾器當你需要手動比較兩個不同算法或?qū)崿F(xiàn)的效率時很有用。

def logged(time_format):
    def decorator(func):
        def decorated_func(*args, **kwargs):
            print "- Running '%s' on %s " % (
                                func.__name__, time.strftime(time_format)
                                )
            start_time = time.time()
            result = func(*args, **kwargs)
            end_time = time.time()
            print "- Finished '%s', executing time = %0.3fs " % (
                                func.__name__, end_time - start_time)
            return result
        decorated_func.__name__ = func.__name__
        return decorated_func
    return decorator

@logged("%Y/%m/%d - %H:%M:%S")
def add1(x, y):
    time.sleep(1)
    return x + y

@logged("%Y/%m/%d - %H:%M:%S")
def add2(x, y):
    time.sleep(2)
    return x + y

print add1(1, 2)
print add2(1, 2)
############看看輸出##################
- Running 'add1' on 2015/12/31 - 15:36:18 
- Finished 'add1', executing time = 1.000s 
3
- Running 'add2' on 2015/12/31 - 15:36:19 
- Finished 'add2', executing time = 2.000s 
3

通過使用函數(shù)來展示運行:

def add1(x, y):
    time.sleep(1)
    return x + y

a = logged("%Y/%m/%d - %H:%M:%S")
print type(a), a.__class__, a.__name__
b = a(add1)
print type(b), b.__class__, b.__name__
c = b(1, 2)
print type(c), c.__class__
print c
#############結(jié)果###################
<type 'function'> <type 'function'> decorator
<type 'function'> <type 'function'> add1
- Running 'add1' on 2015/12/31 - 15:40:08 
- Finished 'add1', executing time = 1.000s 
<type 'int'> <type 'int'>
3

在該結(jié)果中能清晰的看到函數(shù)是如何一步一步運行的猜憎。

該文參考:http://blog.jobbole.com/66895/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末娩怎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子胰柑,更是在濱河造成了極大的恐慌截亦,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柬讨,死亡現(xiàn)場離奇詭異崩瓤,居然都是意外死亡,警方通過查閱死者的電腦和手機踩官,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門却桶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事颖系⌒崞剩” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵嘁扼,是天一觀的道長信粮。 經(jīng)常有香客問我,道長偷拔,這世上最難降的妖魔是什么蒋院? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮莲绰,結(jié)果婚禮上欺旧,老公的妹妹穿的比我還像新娘。我一直安慰自己蛤签,他們只是感情好辞友,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著震肮,像睡著了一般称龙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上戳晌,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天鲫尊,我揣著相機與錄音,去河邊找鬼沦偎。 笑死疫向,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的豪嚎。 我是一名探鬼主播搔驼,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼侈询!你這毒婦竟也來了舌涨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤扔字,失蹤者是張志新(化名)和其女友劉穎囊嘉,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體革为,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡哗伯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了篷角。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片焊刹。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出虐块,到底是詐尸還是另有隱情俩滥,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布贺奠,位于F島的核電站霜旧,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏儡率。R本人自食惡果不足惜挂据,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望儿普。 院中可真熱鬧崎逃,春花似錦、人聲如沸眉孩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽浪汪。三九已至巴柿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間死遭,已是汗流浹背广恢。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留呀潭,地道東北人钉迷。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像蜗侈,于是被迫代替她去往敵國和親篷牌。 傳聞我的和親對象是個殘疾皇子睡蟋,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,118評論 25 707
  • 道理這東西踏幻,說再多也沒有用,貌似理解了去實際上左耳進右耳出是最普遍的現(xiàn)象戳杀。踐行该面,才是改變的根本妓蛮。 知行合一功炮,簡單而...
    丨張偉丨閱讀 332評論 0 1
  • 那是午后的突然一個激靈 我忘記了你的打開方式 背道而馳好久了呢 有些留戀你定制的愛情模式 喊“芝麻”的時候 沒有人...
    茶味梅清閱讀 184評論 0 1
  • 鑾鎖清秋香滿路 楓婀?jié)i漣荻花楚 羅衾衣扣落盤珠 徒留碾塵郁荒蕪 梧桐剪影風塵住 紅袖添香印桃梳 淚濺飛鳶蓄過往 溫...
    倪小南閱讀 279評論 0 0