查看上一節:裝飾器的引入
裝飾器的使用
上節課我們說了:每擴展一個函數就可以手動創建一個新的函數,但是這個方式實在是太麻煩了。
為了解決這個問題,我們可以創建一個函數,讓這個函數可以自動的幫助我們生產函數。
接下來就介紹一下這個自動生成函數的函數怎麼寫:
因為我們在擴展的時候,不同的函數可能攜帶的參數不同,類型不同或者數量不同導致每次都要修改新函數的類型,所以這裡介紹一下*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)
執行結果為:
像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()
執行結果為:
此處是先裝飾了離函數最近的begin_end,又在外部裝飾了fn3裝飾器。如果調換了位置,裝飾順序就不同了。可以自己嘗試一下。
總結:在定義函數時,可以通過@裝飾器,來使用指定的裝飾器,來裝飾當前的函數。
可以同時為一個函數指定多個裝飾器,這樣函數將會按照從內向外的順序被裝飾 。
點擊查看配套視頻教程
更多內容請訂閱python學習站官方技術圈!