python修飾器

1 什么是裝飾器

  • 裝飾器他人的器具,本身可以是任意可調(diào)用對(duì)象,被裝飾者也可以是任意可調(diào)用對(duì)象。本質(zhì)就是函數(shù),功能就是為其他函數(shù)添加附加功能
  • 裝飾器的原則:
    1 不修改被裝飾對(duì)象的源代碼
    2 不修改被裝飾對(duì)象的調(diào)用方式
  • 裝飾器的本質(zhì)就是函數(shù),功能就是為其他函數(shù)添加附加功能

2裝飾器由什么組成

  • 裝飾器由高階函數(shù)+函數(shù)嵌套+閉包組成
  • 高階函數(shù)定義:
    1.函數(shù)接收的參數(shù)是一個(gè)函數(shù)名
    2.函數(shù)的返回值是一個(gè)函數(shù)名
    3.滿足上述條件任意一個(gè),都可稱之為高階函數(shù)
  • 函數(shù)的嵌套
    在一個(gè)函數(shù)內(nèi)定義另外一個(gè)新的函數(shù)
def f1():
    def f2():
        def f3():
            print('from f3')
        f3()
    f2()

f1()

  • 閉包
    閉包的意義:返回的函數(shù)對(duì)象,不僅僅是一個(gè)函數(shù)對(duì)象,在該函數(shù)外還包裹了一層作用域,這使得,該函數(shù)無論在何處調(diào)用,優(yōu)先使用自己外層包裹的作用域。通俗講,就是局部作用域,在自己作用域找不到,向上一層找,找不到再向上一層的上一層找,直到最外層
基本實(shí)現(xiàn)裝飾器
import time

"""
定義一個(gè)函test,在不改函數(shù)源代碼,和調(diào)用方法情況下得到其運(yùn)行時(shí)間
def test():
    time.sleep(2)
    print("函數(shù)test運(yùn)行了")
    print("函數(shù)test運(yùn)行結(jié)束了")
"""


# 函數(shù)名作為入?yún)?-->高階函數(shù)
def timer(func):
    def wrapper():
        # 函數(shù)執(zhí)行前的時(shí)間
        start_time = time.time()
        func()
        # 函數(shù)執(zhí)行后的時(shí)間
        end_time = time.time()
        # 相減得出運(yùn)行時(shí)間
        res = end_time - start_time
        print('運(yùn)行時(shí)間是:%s' %(res))
        return res

    return wrapper


def test():
    time.sleep(2)
    print("函數(shù)test運(yùn)行了")
    print("函數(shù)test運(yùn)行結(jié)束了")

"""1.把函數(shù)名test作為入?yún)魅胝{(diào)用timer,
2.timer運(yùn)行后得到一個(gè)返回值timer函數(shù)嵌套的wrapper函數(shù)的內(nèi)存地址
3.把這個(gè)內(nèi)存地址存到test變量?jī)?nèi)
4.test+(),運(yùn)行這個(gè)返回的內(nèi)存地址即wrapper函數(shù),
wrapper函數(shù)內(nèi)拿到真正的原始的test函數(shù)名,
并且加了計(jì)時(shí)并運(yùn)行test函數(shù),得到運(yùn)行時(shí)間res
"""
test = timer(test)
test()
用@語法堂實(shí)現(xiàn)裝飾器
import time

"""
定義一個(gè)函test,在不改函數(shù)源代碼,和調(diào)用方法情況下得到其運(yùn)行時(shí)間
def test():
    time.sleep(2)
    print("函數(shù)test運(yùn)行了")
    print("函數(shù)test運(yùn)行結(jié)束了")
"""


# 函數(shù)名作為入?yún)?-->高階函數(shù)
def timer(func):
    def wrapper():
        # 函數(shù)執(zhí)行前的時(shí)間
        start_time = time.time()
        func()
        # 函數(shù)執(zhí)行后的時(shí)間
        end_time = time.time()
        # 相減得出運(yùn)行時(shí)間
        res = end_time - start_time
        print('運(yùn)行時(shí)間是:%s' %(res))
        return res

    return wrapper


@timer#------>=之前包裝的 test = timer(test)
def test():
    time.sleep(2)
    print("函數(shù)test運(yùn)行了")
    print("函數(shù)test運(yùn)行結(jié)束了")

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

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

  • 前言 對(duì)python的修飾器的理解一直停留在"使用修飾器把函數(shù)注冊(cè)為事件的處理程序"的層次,也是一知半解;這樣拖著...
    MrYun閱讀 24,695評(píng)論 3 35
  • 前言 Python的修飾器的英文名叫Decorator,當(dāng)你看到這個(gè)英文名的時(shí)候,你可能會(huì)把其跟Design Pa...
    linheimx閱讀 658評(píng)論 0 4
  • 前話: python的修飾器可以說是python語言最有靈性的一個(gè)功能了,看到網(wǎng)上有各種亂亂的文章,所以想自己寫得...
    opluss閱讀 1,188評(píng)論 0 0
  • 1.科研成果呈現(xiàn)的通用邏輯是什么? ‘如何分享你的研究和發(fā)現(xiàn)’ :論文寫作就是傳播研究為什么怎么樣的過程和結(jié)果 a...
    真豬寶貝閱讀 303評(píng)論 0 0
  • 追夢(mèng),一路多少坎坷,多少艱難困苦,又使自己迷失了方向,沒有親人的守望,沒有朋友的力往狂難,只有自己的衣屢蹣裳。 沒...
    阿牛的彼岸閱讀 202評(píng)論 0 2

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