Python中的Decorator裝飾器

Decorator 裝飾器

理解decorator(裝飾器)的關(guān)鍵, 在于理解在python中函數(shù)是第一公民, 并且python中萬物皆對象. 函數(shù)本身可以作為返回對象, 可以作為操作對象.
裝飾器decorator, 就是以@這個特殊操作符, 將它所修飾的函數(shù)A以它所指定的函數(shù)B來處理, 形成另一個函數(shù)C的方式, 其本質(zhì)上跟Java等語言的注解處理沒有兩樣.
@符號, 在python中可以翻譯成這樣一句話: 將下面這個函數(shù)作為參數(shù), 當(dāng)它被調(diào)用時, 以@符號后面的函數(shù)代替它, 并將被裝飾函數(shù)作為參數(shù)傳入給裝飾器. 相當(dāng)于重新賦值了被裝飾的函數(shù).

舉個例子:

@anno1 # 用anno1代替anno2
@anno2 # 用anno2代替anno3
@anno3 # 用anno3代替swap
def swap():
    pass
    
# 以上修飾, 相當(dāng)于調(diào)用了這一句 swap = anno3(anno2(anno1(swap)))
# 因此函數(shù)的裝飾器都需要以函數(shù)作為返回值
# 注意有調(diào)用順序

裝飾器當(dāng)然可以帶參數(shù), 帶上參數(shù)后實際是自動加了一層帶參數(shù)的調(diào)用

@decorator(arg1, arg2)
def func():
    pass
# 相當(dāng)于 func = decorator(arg1, arg2)(func)
# 因此要求decorator(arg1, arg2)返回的是一個可調(diào)用的對象

# 例如定義一個允許任意參數(shù)的裝飾器

# 接受任意參數(shù)的裝飾器, 定義方式與一般函數(shù)相同
def makeHtmlTag(tag, *args, **kwds):
    def real_decorator(fn):
        css_class = " class='{0}'".format(kwds["css_class"]) if "css_class" in kwds else ""
        def wrapped(*args, **kwds): # 定義一個接受參數(shù)的函數(shù), 這個函數(shù)用來替代待裝飾的函數(shù)
            return "<"+tag+css_class+">" + fn(*args, **kwds) + "</"+tag+">"
        return wrapped
    return real_decorator # 返回一個可調(diào)用的對象, 以被裝飾的函數(shù)作為參數(shù)
  
@makeHtmlTag(tag="b", css_class="bold_css")
@makeHtmlTag(tag="i", css_class="italic_css")
def hello():
    return "hello world"

Reference

python中的decorator

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • 部分細節(jié)自己改了點,也加了點自己例子,基本上屬于轉(zhuǎn)載。轉(zhuǎn)載出處:https://my.oschina.net/le...
    洛克黃瓜閱讀 1,994評論 0 3
  • 本文為《爬著學(xué)Python》系列第四篇文章。從本篇開始,本專欄在順序更新的基礎(chǔ)上,會有不規(guī)則的更新。 在Pytho...
    SyPy閱讀 2,514評論 4 11
  • 自從有了孩子,每個六一都絞盡腦汁選書。理由?我最喜歡書了!——小獅子語錄。 今年節(jié)前,我和孩子商量了下,過一個不一...
    芳華2019閱讀 137評論 0 0
  • 在11班的晚修,收到一本何同學(xué)的筆記本,里面密密麻麻的文字,全是他自創(chuàng)自編和想象的各種小說故事情節(jié),主人公就是班里...
    我在棗快樂呀閱讀 195評論 0 3
  • 記得最清晰的就是你給我做的飯,每道菜第一口都能讓我吃出恬靜的味道! 還有時時刻刻都不忘耍酷的自信男! 駕駛員也很帥...
    尚庚世家的美銓閱讀 299評論 0 1