Python裝飾器 Examples

Python裝飾器 Examples:

第一步:最簡(jiǎn)單的函數(shù),準(zhǔn)備附加額外功能

# -*- coding:gbk -*-
'''示例1: 最簡(jiǎn)單的函數(shù),表示調(diào)用了兩次'''

def myfunc():
    print("myfunc() called.")

myfunc()
myfunc()

第二步:使用裝飾函數(shù)在函數(shù)執(zhí)行前和執(zhí)行后分別附加額外功能

# -*- coding:gbk -*-
'''示例2: 替換函數(shù)(裝飾)
裝飾函數(shù)的參數(shù)是被裝飾的函數(shù)對(duì)象振诬,返回原函數(shù)對(duì)象
裝飾的實(shí)質(zhì)語(yǔ)句: myfunc = deco(myfunc)'''

def deco(func):
    print("before myfunc() called.")
    func()
    print("  after myfunc() called.")
    return func

def myfunc():
    print(" myfunc() called.")

myfunc = deco(myfunc)

myfunc()
myfunc()

第三步:使用語(yǔ)法糖@來(lái)裝飾函數(shù)

# -*- coding:gbk -*-
'''示例3: 使用語(yǔ)法糖@來(lái)裝飾函數(shù)纬乍,相當(dāng)于“myfunc = deco(myfunc)”
但發(fā)現(xiàn)新函數(shù)只在第一次被調(diào)用权埠,且原函數(shù)多調(diào)用了一次'''

def deco(func):
    print("before myfunc() called.")
    func()
    print("  after myfunc() called.")
    return func

@deco
def myfunc():
    print(" myfunc() called.")

myfunc()
myfunc()

第四步:使用內(nèi)嵌包裝函數(shù)來(lái)確保每次新函數(shù)都被調(diào)用

# -*- coding:gbk -*-
'''示例4: 使用內(nèi)嵌包裝函數(shù)來(lái)確保每次新函數(shù)都被調(diào)用杈绸,
內(nèi)嵌包裝函數(shù)的形參和返回值與原函數(shù)相同形纺,裝飾函數(shù)返回內(nèi)嵌包裝函數(shù)對(duì)象'''

def deco(func):
    def _deco():
        print("before myfunc() called.")
        func()
        print("  after myfunc() called.")
        # 不需要返回func,實(shí)際上應(yīng)返回原函數(shù)的返回值
    return _deco

@deco
def myfunc():
    print(" myfunc() called.")
    return 'ok'

myfunc()
myfunc()

第五步:對(duì)帶參數(shù)的函數(shù)進(jìn)行裝飾

# -*- coding:gbk -*-
'''示例5: 對(duì)帶參數(shù)的函數(shù)進(jìn)行裝飾评也,
內(nèi)嵌包裝函數(shù)的形參和返回值與原函數(shù)相同,裝飾函數(shù)返回內(nèi)嵌包裝函數(shù)對(duì)象'''

def deco(func):
    def _deco(a, b):
        print("before myfunc() called.")
        ret = func(a, b)
        print("  after myfunc() called. result: %s" % ret)
        return ret
    return _deco

@deco
def myfunc(a, b):
    print(" myfunc(%s,%s) called." % (a, b))
    return a + b

myfunc(1, 2)
myfunc(3, 4)

第六步:對(duì)參數(shù)數(shù)量不確定的函數(shù)進(jìn)行裝飾

# -*- coding:gbk -*-
'''示例6: 對(duì)參數(shù)數(shù)量不確定的函數(shù)進(jìn)行裝飾灭返,
參數(shù)用(*args, **kwargs)盗迟,自動(dòng)適應(yīng)變參和命名參數(shù)'''

def deco(func):
    def _deco(*args, **kwargs):
        print("before %s called." % func.__name__)
        ret = func(*args, **kwargs)
        print("  after %s called. result: %s" % (func.__name__, ret))
        return ret
    return _deco

@deco
def myfunc(a, b):
    print(" myfunc(%s,%s) called." % (a, b))
    return a+b

@deco
def myfunc2(a, b, c):
    print(" myfunc2(%s,%s,%s) called." % (a, b, c))
    return a+b+c

myfunc(1, 2)
myfunc(3, 4)
myfunc2(1, 2, 3)
myfunc2(3, 4, 5)

第七步:讓裝飾器帶參數(shù)

# -*- coding:gbk -*-
'''示例7: 在示例4的基礎(chǔ)上,讓裝飾器帶參數(shù)熙含,
和上一示例相比在外層多了一層包裝罚缕。
裝飾函數(shù)名實(shí)際上應(yīng)更有意義些'''

def deco(arg):
    def _deco(func):
        def __deco():
            print("before %s called [%s]." % (func.__name__, arg))
            func()
            print("  after %s called [%s]." % (func.__name__, arg))
        return __deco
    return _deco

@deco("mymodule")
def myfunc():
    print(" myfunc() called.")

@deco("module2")
def myfunc2():
    print(" myfunc2() called.")

myfunc()
myfunc2()

第八步:讓裝飾器帶 類 參數(shù)

# -*- coding:gbk -*-
'''示例8: 裝飾器帶類參數(shù)'''

class locker:
    def __init__(self):
        print("locker.__init__() should be not called.")

    @staticmethod
    def acquire():
        print("locker.acquire() called.(這是靜態(tài)方法)")

    @staticmethod
    def release():
        print("  locker.release() called.(不需要對(duì)象實(shí)例)")

def deco(cls):
    '''cls 必須實(shí)現(xiàn)acquire和release靜態(tài)方法'''
    def _deco(func):
        def __deco():
            print("before %s called [%s]." % (func.__name__, cls))
            cls.acquire()
            try:
                return func()
            finally:
                cls.release()
        return __deco
    return _deco

@deco(locker)
def myfunc():
    print(" myfunc() called.")

myfunc()
myfunc()

第九步:裝飾器帶類參數(shù),并分拆公共類到其他py文件中怎静,同時(shí)演示了對(duì)一個(gè)函數(shù)應(yīng)用多個(gè)裝飾器

# -*- coding:gbk -*-
'''mylocker.py: 公共類 for 示例9.py'''

class mylocker:
    def __init__(self):
        print("mylocker.__init__() called.")

    @staticmethod
    def acquire():
        print("mylocker.acquire() called.")

    @staticmethod
    def unlock():
        print("  mylocker.unlock() called.")

class lockerex(mylocker):
    @staticmethod
    def acquire():
        print("lockerex.acquire() called.")

    @staticmethod
    def unlock():
        print("  lockerex.unlock() called.")

def lockhelper(cls):
    '''cls 必須實(shí)現(xiàn)acquire和release靜態(tài)方法'''
    def _deco(func):
        def __deco(*args, **kwargs):
            print("before %s called." % func.__name__)
            cls.acquire()
            try:
                return func(*args, **kwargs)
            finally:
                cls.unlock()
        return __deco
    return _deco


# -*- coding:gbk -*-
'''示例9: 裝飾器帶類參數(shù)邮弹,并分拆公共類到其他py文件中
同時(shí)演示了對(duì)一個(gè)函數(shù)應(yīng)用多個(gè)裝飾器'''

from mylocker import *

class example:
    @lockhelper(mylocker)
    def myfunc(self):
        print(" myfunc() called.")

    @lockhelper(mylocker)
    @lockhelper(lockerex)
    def myfunc2(self, a, b):
        print(" myfunc2() called.")
        return a + b

if __name__=="__main__":
    a = example()
    a.myfunc()
    print(a.myfunc())
    print(a.myfunc2(1, 2))
    print(a.myfunc2(3, 4))

FROM http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蚓聘,隨后出現(xiàn)的幾起案子腌乡,更是在濱河造成了極大的恐慌,老刑警劉巖夜牡,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件与纽,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡氯材,警方通過(guò)查閱死者的電腦和手機(jī)渣锦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)氢哮,“玉大人袋毙,你說(shuō)我怎么就攤上這事∪哂龋” “怎么了听盖?”我有些...
    開(kāi)封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)裂七。 經(jīng)常有香客問(wèn)我皆看,道長(zhǎng),這世上最難降的妖魔是什么背零? 我笑而不...
    開(kāi)封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任腰吟,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘毛雇。我一直安慰自己嫉称,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布灵疮。 她就那樣靜靜地躺著织阅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪震捣。 梳的紋絲不亂的頭發(fā)上荔棉,一...
    開(kāi)封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音蒿赢,去河邊找鬼润樱。 笑死,一個(gè)胖子當(dāng)著我的面吹牛诉植,可吹牛的內(nèi)容都是我干的祥国。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼晾腔,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼舌稀!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起灼擂,我...
    開(kāi)封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤壁查,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后剔应,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體睡腿,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年峻贮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了席怪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡纤控,死狀恐怖挂捻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情船万,我是刑警寧澤刻撒,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站耿导,受9級(jí)特大地震影響声怔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜舱呻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一醋火、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦胎撇、人聲如沸介粘。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至雅采,卻和暖如春爵憎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背婚瓜。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工宝鼓, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人巴刻。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓愚铡,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親胡陪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子沥寥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)柠座,斷路器邑雅,智...
    卡卡羅2017閱讀 134,628評(píng)論 18 139
  • 前言 人生苦多,快來(lái) Kotlin 妈经,快速學(xué)習(xí)Kotlin淮野! 什么是Kotlin? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,161評(píng)論 9 118
  • 要點(diǎn): 函數(shù)式編程:注意不是“函數(shù)編程”吹泡,多了一個(gè)“式” 模塊:如何使用模塊 面向?qū)ο缶幊蹋好嫦驅(qū)ο蟮母拍钪栊恰傩浴?..
    victorsungo閱讀 1,476評(píng)論 0 6
  • 在通往成功的路上 得承受一些人的不屑與輕視 還得承受一些人的不理解與不信任 OK,這些都不重要 重要的是爆哑,你的心夠...
    葉娜姐姐閱讀 197評(píng)論 0 1
  • 5/30天#寫手圈連續(xù)寫作訓(xùn)練營(yíng)# 【讀書】 【讀書感悟】 【寫作】《論騎士精神》——白鼠 百年戰(zhàn)爭(zhēng)洞难,十字軍東征,...
    作家白鼠閱讀 632評(píng)論 0 1