python進階—裝飾器Decorator

python裝飾器是在函數調用之上的修飾,這些修飾是在聲明或者定義一個函數的時候進行設置的。同時,裝飾器是一個返回函數對象的高級函數。裝飾器的語法是以@開頭的,而后是裝飾器函數的名字以及可選的參數,而后是裝飾器要修飾的函數以及該函數的可選參數,主要是以下形式:

@decorator(dec_opt_args)
def func2Bdecorator(func_opt_args):
......

1 裝飾器與函數類型

裝飾器類型

裝飾器有兩種形式,無參decorator以及有參decorator:
無參decorator
生成一個新的經過裝飾的函數,并用這個經過裝飾的函數代替原函數
有參decorator
裝飾函數首先處理傳入的decorator參數,并生成一個新的裝飾器函數,然后使用這個裝飾器函數對要被裝飾的函數進行裝飾

函數類型

同時函數又分為有參和無參兩種
無參函數
對于無參數的函數,并沒有什么需要特別注意的地方
有參函數
因為傳入裝飾器的函數是不定的,也就是說傳入的參數也是不定的,為了使裝飾器能對所有參數類型的函數進行處理,裝飾器中函數的參數有特殊處理,接下來會介紹

2 無參裝飾器-無參函數

def decorator_func(func):
    def handle():
        print "the function of %s begin ..." %func.__name__
        func()
        print "the function of %s end !" %func.__name__
    return handle

@decorator_func
def say():
    print "hello decorator!"

say( )
print say.__name__

上述代碼最后調用say函數的輸出如下:

the function of say begin ...
hello decorator!
the function of say end!
handle

decorator_func是一個裝飾器(decorator),返回一個函數對象。上述代碼中,在定義say函數前加上了@decorator_func之后,雖然say( )函數還是存在的,但是say變量指向了由decorator_func返回的handle函數對象,于是在上述代碼的最后打印say的函數名的輸出結果是handle而不是say

3 無參裝飾器-有參函數

當需要修飾的函數帶有參數時,裝飾器的定義跟上述無參函數有一定的區別,主要為了讓裝飾器可以應對具有參數不同的各種函數

def decorator_func(func):
    def handle(*args, **kwargs):
        print "the function of %s begin ..." %func.__name__
        func(*args, **kwargs)
        print "the function of %s end !" %func.__name__
    return handle

@decorator
def say(name = "world"):
    print "hello %s!" %name

4 有參裝飾器-無參函數

當裝飾器帶有參數,也就是在原來裝飾器的基礎上再做一層封裝。代碼實現如下:

def decomaker_func(text):
    def decorator_func(func):
        def handle():
            print "%s-->%s()!" %(text, func.__name__)
            func()
        return handle
    return decorator_func

@decomaker_func("haha")
def say():
    print "hello, decomaker!"

say()

上述代碼的輸出:

haha-->say()
hello, decomaker!

因裝飾器自身帶有參數,于是將其稱之為decomaker,也就是上述定義中的第一層函數decomaker_func,它的作用是返回一個decorator也就是第二層函數decorator_func,這層函數的作用就是將封裝好的handle函數賦值給say變量。

5 有參裝飾器-有參函數

def decomaker_func(text):
    def decorator_func(func):
        def handle(*args, **kwargs):
            print "%s-->%s(*args, **kwargs)!" %(text, func.__name__)
            func(*args, **kwargs)
        return handle
    return decorator_func

@decomaker_func("haha")
def say(name = "decomaker"):
    print "hello, %s!" %name

say()

輸出:

haha-->say(*args, **kwargs)
hello, decomaker!

6 給函數裝飾多個裝飾器

當一個函數由多個裝飾器進行裝飾時,其裝飾過程是有固定的順序的,比如如下的形式:

@d1
@d2(args)
@d3
def f():

等價于:

f = d1(d2(args)(d3(f)))
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評論 6 546
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,814評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,779評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,109評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,287評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,799評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,515評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,750評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,933評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,492評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,703評論 2 380

推薦閱讀更多精彩內容

  • 本文為《爬著學Python》系列第四篇文章。從本篇開始,本專欄在順序更新的基礎上,會有不規則的更新。 在Pytho...
    SyPy閱讀 2,514評論 4 11
  • Python進階框架 希望大家喜歡,點贊哦首先感謝廖雪峰老師對于該課程的講解 一、函數式編程 1.1 函數式編程簡...
    Gaolex閱讀 5,517評論 6 53
  • 每個人都有的內褲主要功能是用來遮羞,但是到了冬天它沒法為我們防風御寒,咋辦?我們想到的一個辦法就是把內褲改造一下,...
    chen_000閱讀 1,369評論 0 3
  • 要點: 函數式編程:注意不是“函數編程”,多了一個“式” 模塊:如何使用模塊 面向對象編程:面向對象的概念、屬性、...
    victorsungo閱讀 1,552評論 0 6
  • 秋天周六的早上,起床發現露臺上曬得都是土,靠近才發現幾個花盆里的土都被倒出來了。我四處尋覓我的杜鵑花,然而不見蹤影...
    朕要揭房上瓦閱讀 538評論 0 2