python之裝飾器

Python之裝飾器

裝飾器本質(zhì)上是一個Python函數(shù)似舵,它可以讓其他函數(shù)在不需要做任何代碼變動的前提下增加額外功能,裝飾器的返回值也是一個函數(shù)對象缩焦。它經(jīng)常用于有切面需求的場景欲芹,比如:插入日志衙传、性能測試、事務(wù)處理蚓胸、緩存挣饥、權(quán)限校驗等場景。裝飾器是解決這類問題的絕佳設(shè)計沛膳,有了裝飾器扔枫,我們就可以抽離出大量與函數(shù)功能本身無關(guān)的雷同代碼并繼續(xù)重用。概括的講锹安,裝飾器的作用就是為已經(jīng)存在的對象添加額外的功能短荐。

它可以裝飾的東西有:函數(shù)、類

由以下例子來講述叹哭,

part1簡單裝飾器

假如說我們由一個需求忍宋,計算兩個數(shù)字的和

def sum(x, y):
    print ("The sum is: " + str(x + y))

現(xiàn)在我們需要對需求加以改進,加上函數(shù)執(zhí)行的時間风罩。

那么不使用裝飾器的代碼糠排,我們可能會按以下方式實現(xiàn):

In [11]: import time

In [12]: def sum(x, y):
    ...:     begin_time = time.time()
    ...:     value = x + y
    ...:     print ("The time cost is: %s " %(time.time() - begin_time))
    ...:     return value
    ...:

但是這時候,我們發(fā)現(xiàn)超升,代碼不是很和諧入宦。 不符合pythonic哺徊。

那么這時候,我們可以使用裝飾器了

# 先定義一個裝飾器
def time_cost(func):
    def wrapper(x, y):
        begin_time = time.time()
        value = func(x, y)
        print("The time cost is %s" %(time.time() - begin_time))
        return value
return wrapper

# 使用裝飾器
@time_cost
def sum(x, y):
    return x + y

這時候我們再次調(diào)用sum()函數(shù)時云石,跟剛開始我們實現(xiàn)的結(jié)果一樣唉工,但是對于我們的代碼而言,卻更加的簡潔汹忠,工整淋硝。

part2 帶參數(shù)的裝飾器

我們也可以對裝飾器加上參數(shù)。

我們以另一個例子來解釋:

def use_logging(level):
def decorator(func):
    def wrapper(*args, **kwargs):
        if level == "warn":
            logging.warn("%s is running" % func.__name__)
        return func(*args)
    return wrapper

return decorator

@use_logging(level="warn")
def foo(name='foo'):
    print("i am %s" % name)

在上述的use_logging是允許帶參數(shù)的裝飾器宽菜。它實際上是對原有裝飾器的一個函數(shù)封裝谣膳,并返回一個裝飾器。我們可以將它理解為一個含有參數(shù)的閉包铅乡。當我們使用@use_logging(level="warn")調(diào)用時继谚。可以解釋器可以發(fā)現(xiàn)這一層封裝阵幸,并把參數(shù)傳遞到裝飾器的環(huán)境中花履。

part3 內(nèi)置裝飾器

內(nèi)置裝飾器主要有三個 @staticmathod、 @classmethod挚赊、 @property诡壁。

對于前兩者:

  • 兩者的區(qū)別在于@classmethod的第一個參數(shù)會默認為calculations這個類。

而@property的作用主要是提供一個把類方法變成類屬性的方法荠割。
比如可以把@property用作getter和setter妹卿。

以上,是簡單的總結(jié)蔑鹦。

參考資料:

鏈接:https://www.zhihu.com/question/26930016/answer/99243411

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末夺克,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子嚎朽,更是在濱河造成了極大的恐慌铺纽,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哟忍,死亡現(xiàn)場離奇詭異狡门,居然都是意外死亡,警方通過查閱死者的電腦和手機魁索,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門融撞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人粗蔚,你說我怎么就攤上這事尝偎。” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵致扯,是天一觀的道長肤寝。 經(jīng)常有香客問我,道長抖僵,這世上最難降的妖魔是什么鲤看? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮耍群,結(jié)果婚禮上义桂,老公的妹妹穿的比我還像新娘。我一直安慰自己蹈垢,他們只是感情好慷吊,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著曹抬,像睡著了一般溉瓶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上谤民,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天堰酿,我揣著相機與錄音,去河邊找鬼张足。 笑死触创,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的兢榨。 我是一名探鬼主播嗅榕,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼顺饮,長吁一口氣:“原來是場噩夢啊……” “哼吵聪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起兼雄,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤吟逝,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后赦肋,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體块攒,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年佃乘,在試婚紗的時候發(fā)現(xiàn)自己被綠了囱井。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡趣避,死狀恐怖庞呕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤住练,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布地啰,位于F島的核電站,受9級特大地震影響讲逛,放射性物質(zhì)發(fā)生泄漏亏吝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一盏混、第九天 我趴在偏房一處隱蔽的房頂上張望蔚鸥。 院中可真熱鬧,春花似錦许赃、人聲如沸株茶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽启盛。三九已至,卻和暖如春技羔,著一層夾襖步出監(jiān)牢的瞬間僵闯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工藤滥, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鳖粟,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓拙绊,卻偏偏與公主長得像向图,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子标沪,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

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

  • 1.認識裝飾器 在python中榄攀,對于一個函數(shù),若想在其運行前后做點什么金句,那么裝飾器是再好不過的選擇檩赢,話不多說,上...
    howie6879閱讀 1,415評論 4 20
  • 裝飾器的作用: 裝飾模式有很多經(jīng)典的使用場景违寞,例如插入日志贞瞒、性能測試、事務(wù)處理等等趁曼,有了裝飾器军浆,就可以提取大量函數(shù)...
    冰西瓜大郎閱讀 224評論 0 0
  • 參考網(wǎng)址> http://www.cnblogs.com/rhcad/archive/2011/12/21/229...
    Alecyrus閱讀 401評論 0 2
  • 裝飾器 裝飾器本質(zhì)上是一個Python函數(shù),它可以讓其他函數(shù)在不需要做任何代碼變動的前提下增加額外功能挡闰,裝飾器的返...
    時間之友閱讀 2,247評論 0 3
  • 怒放的生命 教學(xué)樓前的草坪上乒融,一棵偉岸的青松樹下,一小塊兒裸露的泥土里,一棵梔子花正熱鬧的開放——綠油油的葉子盡情...
    六月_cef1閱讀 369評論 4 3