分類目錄:《系統學習Python》總目錄
文章《系統學習Python——裝飾器:類裝飾器-[單例類:基礎知識]》的單例示例闡明了如何使用類裝飾器來管理一個類的所有實例。類裝飾器的另一個常用場景是為每個生成的實例擴展接口。類裝飾器基本上可以在實例上安裝一個包裝器或“代理"邏輯層,以某種方式管理對其接口的訪問。
例如在第31章中,__getattr__
運算符重載方法作為包裝內嵌實例的完整對象接口的一種方式,以便實現委托編程模式。我們在之前的文章中介紹的管理的屬性中看到過類似的例子。當獲取未定義的屬性名的時候,__getattr__
會運行;我們可以使用這個鉤子來攔截控制器類中的方法調用,并將它們傳遞給一個嵌人的對象。
為了便于參考,這里給出最初的非裝飾器委托示例,它在兩個內置類型對象上工作:
class Wrapper:def __init__(self, object):self.wrapped = objectdef __getattr__(self, attrname):print('Trace:', attrname)return getattr(self.wrapped, attrname)
輸入:
x = Wrapper([1,2,3])
x.append(4)
x.wrapped
輸出:
Trace: append
[1, 2, 3, 4]
在這段代碼中,Wrapper
類攔截了對任何被包裝對象的命名屬性的訪問,打印出一條跟蹤信息,并且使用內置數getattr
來終止對包裝對象的請求。準確地說,它跟蹤在被包裝對象的類之外發出的屬性訪問。在被包裝對象的內部訪問其方法不會被捕獲,并且會按照設計正常運行。這種整體接口模型和函數裝飾器的行為不同,裝飾器只包裝一個特定的方法。
參考文獻:
[1] Mark Lutz. Python學習手冊[M]. 機械工業出版社, 2018.