本文實例講述了Python裝飾器基礎概念與用法。分享給大家供大家參考,具體如下:
裝飾器基礎
前面快速介紹了裝飾器的語法,在這里,我們將深入裝飾器內部工作機制,更詳細更系統地介紹裝飾器的內容,并學習自己編寫新的裝飾器的更多高級語法。
什么是裝飾器
裝飾是為函數和類指定管理代碼的一種方式。Python裝飾器以兩種形式呈現:
【1】函數裝飾器在函數定義的時候進行名稱重綁定,提供一個邏輯層來管理函數和方法或隨后對它們的調用。
【2】類裝飾器在類定義的時候進行名稱重綁定,提供一個邏輯層來管理類,或管理隨后調用它們所創建的實例。
簡而言之,裝飾器提供了一種方法,在函數和類定義語句的末尾插入自動運行的代碼——對于函數裝飾器,在def的末尾;對于類裝飾器,在class的末尾。這樣的代碼可以扮演不同的角色。
裝飾器提供了一些和代碼維護性和審美相關的有點。此外,作為結構化工具,裝飾器自然地促進了代碼封裝,這減少了冗余性并使得未來變得更容易。
函數裝飾器
通過在一個函數的def語句的末尾運行另一個函數,把最初的函數名重新綁定到結果。
用法
裝飾器在緊挨著定義一個函數或方法的def語句之前的一行編寫,并且它由@符號以及緊隨其后的對于元函數的一個引用組成——這是管理另一個函數的一個函數(或其他可調用對象)。
在編碼上,函數裝飾器自動將如下語法:
@decoratordef F(arg): ...F(99)
映射為這個對等形式:
def F(arg): ...F = decorator(F)F(99)
這里的裝飾器是一個單參數的可調用對象,它返回與F具有相同數目的參數的一個可調用對象。
當隨后調用F函數的時候,它自動調用裝飾器所返回的對象。
換句話說,裝飾實際把如下的第一行映射為第二行(盡管裝飾器只在裝飾的時候運行一次)
fun(6,7)decorator(func)(6,7)
這一自動名稱重綁定也解釋了之前介紹的靜態方法和property裝飾器語法的原因:
class C: @staticmethod def meth(...):... @property def name(self):...
實現
裝飾器自身是返回可調用對象的可調用對象。實際上,它可以是任意類型的可調用對象,并且返回任意類型的可調用對象:函數和類的任何組合都可以使用,盡管一些組合更適合于特定的背景。
有一種常用的編碼模式——裝飾器返回了一個包裝器,包裝器把最初的函數保持到一個封閉的作用域中:
def decorator(F): def wrapper(*args): # 使用 F 和 *args # 調用原來的F(*args) return wrapper@decoratordef func(x,y): ...func(6,7)
新聞熱點
疑難解答