開發與維運

裝飾器的使用 | Python從入門到精通:高階篇之十八

查看上一節:裝飾器的引入

裝飾器的使用

上節課我們說了:每擴展一個函數就可以手動創建一個新的函數,但是這個方式實在是太麻煩了。

為了解決這個問題,我們可以創建一個函數,讓這個函數可以自動的幫助我們生產函數。
接下來就介紹一下這個自動生成函數的函數怎麼寫:

因為我們在擴展的時候,不同的函數可能攜帶的參數不同,類型不同或者數量不同導致每次都要修改新函數的類型,所以這裡介紹一下*args 這種通用的用法解決該問題。

def begin_end(old):
    '''
用來對其他函數進行擴展,使其他函數可以在執行前打印開始執行,執行後打印執行結束

        參數:
            old 要擴展的函數對象
    '''
    # 創建一個新函數
    def new_function(*args , **kwargs):
        print('開始執行~~~~')
        # 調用被擴展的函數
        result = old(*args , **kwargs)
        print('執行結束~~~~')
        # 返回函數的執行結果
        return result

    # 返回新函數        
    return new_function

f = begin_end(fn)
f2 = begin_end(add)
f3 = begin_end(mul)

# r = f()
# r = f2(123,456)
r = f3(123,456)
print(r)

執行結果為:
image.png
像begin_end()這種函數我們就稱它為裝飾器(舊函數作為一個參數傳進去,返回一個新函數)。

通過裝飾器,可以在不修改原來函數的情況下來對函數進行擴展。

在開發中,我們都是通過裝飾器來擴展函數的功能的。

裝飾器的典型用法

def fn3(old):
    '''
        用來對其他函數進行擴展,使其他函數可以在執行前打印開始執行,執行後打印執行結束

        參數:
            old 要擴展的函數對象
    '''
    # 創建一個新函數
    def new_function(*args , **kwargs):
        print('fn3裝飾~開始執行~~~~')
        # 調用被擴展的函數
        result = old(*args , **kwargs)
        print('fn3裝飾~執行結束~~~~')
        # 返回函數的執行結果
        return result

    # 返回新函數        
    return new_function

@fn3
@begin_end
def say_hello():
    print('大家好~~~')

say_hello()

執行結果為:
image.png
此處是先裝飾了離函數最近的begin_end,又在外部裝飾了fn3裝飾器。如果調換了位置,裝飾順序就不同了。可以自己嘗試一下。

總結:在定義函數時,可以通過@裝飾器,來使用指定的裝飾器,來裝飾當前的函數。

可以同時為一個函數指定多個裝飾器,這樣函數將會按照從內向外的順序被裝飾 。

點擊查看配套視頻教程

更多內容請訂閱python學習站官方技術圈!

Leave a Reply

Your email address will not be published. Required fields are marked *