裝飾器decorator

  • 什么時候用裝飾器
    想要給函數(shù)動態(tài)的增加一些額外的功能。
    Python裝飾器(decorator)在實現(xiàn)的時候,被裝飾后的函數(shù)其實已經(jīng)是另外一個函數(shù)了(函數(shù)名等函數(shù)屬性會發(fā)生改變),為了不影響,Python的functools包中提供了一個叫wraps的decorator來消除這樣的副作用。
  • 不加@wraps(func),函數(shù)的名字就是wrapper
  • 加@wraps(func),可以保留被裝飾前的函數(shù)名
  1. 外層函數(shù)嵌套內(nèi)層函數(shù)
  2. 外層函數(shù)返回內(nèi)層函數(shù)
  3. 內(nèi)層函數(shù)要使用外層函數(shù)傳遞的參數(shù)

調(diào)用函數(shù),如果帶括號,那么是調(diào)用函數(shù)運行后的結(jié)果,
調(diào)用函數(shù)不帶括號,調(diào)用的是函數(shù)本身

"""__author__= 雍新有"""
import random
import time
from functools import wraps


def record_time(func):
    
    @wraps(func)
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print(f'{func.__name__}執(zhí)行時間: {end - start}秒')
        return result

    return wrapper


@record_time
def download(filename):
    print(f'開始下載{filename}')
    time.sleep(random.randint(5, 15))
    print(f'{filename}下載完成')


@record_time
def upload(filename):
    print(f'開始上傳{filename}')
    time.sleep(random.randint(5, 15))
    print(f'{filename}上傳完成')


def main():
    print(download.__name__)
    print(upload.__name__)
    download('Python從入門到住院.pdf')
    upload('蒼老師.avi')
    download.__wrapped__('Python從入門到住院.pdf')
    upload.__wrapped__('蒼老師.avi')


if __name__ == '__main__':
    main()
"""
download
upload
開始下載Python從入門到住院.pdf
Python從入門到住院.pdf下載完成
download執(zhí)行時間: 8.000381231307983秒
開始上傳蒼老師.avi
蒼老師.avi上傳完成
upload執(zhí)行時間: 13.00049352645874秒
開始下載Python從入門到住院.pdf
Python從入門到住院.pdf下載完成
開始上傳蒼老師.avi
蒼老師.avi上傳完成
"""
+ 裝飾器在Django中就是中間件middleware
# record_time是一個裝飾器函數(shù)(裝飾別的函數(shù)或者類的函數(shù))
# 裝飾器函數(shù)可以用來裝飾一個類或函數(shù)
# 如果裝飾器用來裝飾函數(shù)那么他的參數(shù)就是被裝飾的函數(shù)(func)
def record_time(func):
    # 裝飾器中內(nèi)嵌的wrapper函數(shù)是帶裝飾功能的函數(shù)
    # 它除了要執(zhí)行被裝飾的函數(shù)之外要執(zhí)行額外的代碼
    def wrapper(*args, **kwargs):
        #  在執(zhí)行被裝飾的函數(shù)之前要做什么

        result = func(*args, **kwargs)
        #  在執(zhí)行被裝飾的函數(shù)之后要做什么

        return result

    return wrapper()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 許多面向?qū)ο蠖加衐ecorator(裝飾器)函數(shù),比如python中也可以用decorator函數(shù)來強(qiáng)化代碼...
    ITgecko閱讀 8,438評論 0 0
  • 一、背景最近在看activemq的時候,無意看到其web操作頁面的結(jié)構(gòu)框架很有意思,剛開始有點懵,但仔細(xì)摸索半天并...
    笑才閱讀 1,853評論 0 0
  • 一直沒理解Decorator的作用,但最近在很多框架和庫中看到它的身影,尤其是React和Redux,還有mobx...
    cbw100閱讀 22,739評論 2 31
  • 友之女,正花季,眼望春色將來至。東風(fēng)惡,歡情薄,一腳油門,陰陽兩隔,可恨罪人肇事逃逸,錯!錯!錯! 天...
    新新唐王閱讀 343評論 0 3
  • 昨晚后半夜下起了久違的大雨,早晨刮起了狂風(fēng),暴雨如注、狂風(fēng)怒吼,一幅天翻地覆的景象。下午一切變得平靜,老天爺也累了...
    26c0acdcc586閱讀 311評論 0 5

友情鏈接更多精彩內(nèi)容