溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

python裝飾器的寫法有哪些

發(fā)布時(shí)間:2020-11-06 09:43:53 來源:億速云 閱讀:189 作者:小新 欄目:編程語言

python裝飾器的寫法有哪些?這個(gè)問題可能是我們?nèi)粘W(xué)習(xí)或工作經(jīng)常見到的。希望通過這個(gè)問題能讓你收獲頗深。下面是小編給大家?guī)淼膮⒖純?nèi)容,讓我們一起來看看吧!

裝飾器的示例代碼

# 定義裝飾器
def decorator(func):
    def inner():
        # 在內(nèi)部函數(shù)里面對(duì)已有函數(shù)進(jìn)行裝飾
        print('已添加登錄認(rèn)證')
        func()
 
    return inner
 
 
def comment():
    print('發(fā)表評(píng)論')
 
 
# 調(diào)用裝飾器對(duì)已有函數(shù)進(jìn)行裝飾,左邊的comment=inner
comment = decorator(comment)
 
# 調(diào)用方式不變
comment()

裝飾器的語法糖寫法

如果有多個(gè)函數(shù)都需要添加登錄驗(yàn)證的功能,每次都需要編寫func = decorator(func)這樣代碼對(duì)已有函數(shù)進(jìn)行裝飾,這種做法還是比較麻煩。

Python給提供了一個(gè)裝飾函數(shù)更加簡(jiǎn)單的寫法,那就是語法糖,語法糖的書寫格式是: @裝飾器名字,通過語法糖的方式也可以完成對(duì)已有函數(shù)的裝飾。

# 定義裝飾器
def decorator(func):
    def inner():
        # 在內(nèi)部函數(shù)里面對(duì)已有函數(shù)進(jìn)行裝飾
        print('已添加登錄認(rèn)證')
        func()
 
    return inner
 
 
@decorator  # comment = decorator(comment) 裝飾器語法糖對(duì)該代碼進(jìn)行了封裝 左邊comment=inner
def comment():
    print('發(fā)表評(píng)論')
 
 
# 調(diào)用方式不變
comment()

裝飾器的執(zhí)行時(shí)機(jī)

當(dāng)前模塊加載完成以后,裝飾器會(huì)立即執(zhí)行,對(duì)已有函數(shù)進(jìn)行裝飾。

# 定義裝飾器
def decorator(func):
    print('裝飾器執(zhí)行了')
 
    def inner():
        # 在內(nèi)部函數(shù)里面對(duì)已有函數(shù)進(jìn)行裝飾
        print('已添加登錄認(rèn)證')
        func()
 
    return inner
 
 
@decorator  # comment = decorator(comment) 裝飾器語法糖對(duì)該代碼進(jìn)行了封裝 左邊comment=inner
def comment():
print('發(fā)表評(píng)論')

運(yùn)行結(jié)果

裝飾器執(zhí)行了

1

裝飾器實(shí)現(xiàn)已有函數(shù)執(zhí)行時(shí)間的統(tǒng)計(jì)

import time
 
 
def decorator(func):
    def inner():
        # 獲取時(shí)間距離1970-1-1 0:0:1的時(shí)間差
        begin = time.time()
        func()
        end = time.time()
        result = end - begin
        print(f'函數(shù)執(zhí)行完成耗時(shí):{result}')
 
    return inner
 
 
@decorator
def work():
    for i in range(10000):
        print(i)
 
 
work()

 裝飾帶有參數(shù)的函數(shù)

def decorator(func):
    def inner(num1, num2):
        print('正在努力執(zhí)行加法計(jì)算')
        func(num1, num2)
 
    return inner
 
 
@decorator
def add_num(num1, num2):
    result = num1 + num2
    print(f'結(jié)果為:{result}')
 
 
add_num(1, 2)

 裝飾帶有參數(shù)、返回值的函數(shù)

def decorator(func):
    def inner(num1, num2):
        print('正在努力執(zhí)行加法計(jì)算')
        num = func(num1, num2)
        return num
 
    return inner
 
 
@decorator
def add_num(num1, num2):
    result = num1 + num2
    return result
 
 
result = add_num(1, 2)
print(f'結(jié)果為:{result}')

類裝飾器的使用

class MyDecorator(object):
    def __init__(self, func):
        self.__func = func
 
    # 實(shí)現(xiàn)__call__方法,表示對(duì)象是一個(gè)可調(diào)用對(duì)象,可以像調(diào)用函數(shù)一樣進(jìn)行調(diào)用
    def __call__(self, *args, **kwargs):
        # 對(duì)已有函數(shù)進(jìn)行封裝
        print('馬上就有下班啦')
        self.__func()
 
 
@MyDecorator  # @MyDecorator => show = MyDecorator(show)
def show():
    print('快要下雪啦')
 
 
# 執(zhí)行show,就相當(dāng)于執(zhí)行MyDecorator類創(chuàng)建的實(shí)例對(duì)象,show() => 對(duì)象()
show()

擴(kuò)展:

函數(shù)之所以能夠調(diào)用,是因?yàn)楹瘮?shù)內(nèi)部實(shí)現(xiàn)了 __call__ 方法

感謝各位的閱讀!看完上述內(nèi)容,你們對(duì)python裝飾器的寫法有哪些大概了解了嗎?希望文章內(nèi)容對(duì)大家有所幫助。如果想了解更多相關(guān)文章內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI