一篇乾貨教你什麼叫裝飾器以及如何在訪問特性時執行代碼

今天我們首先說一說靜態方法和類成員方法。

靜態方法(staticmethod):指的是沒有self 參數,且可被自身調用。

類成員方法(classmethod):指的是需要名為cls的類似於self參數,可以直接用類的具體對象調用,但是自動被綁定到類上。

說到這裡就要說一下包裝方法,也叫做裝飾器

它能夠對任何可調用的對象包裝,包括方法,函數。

使用@操作符,在方法函數上方列出裝飾器,多個裝飾器在應用是的順序與指定順序相反。

看下圖兩個例子,完美的闡釋了裝飾器。

一篇乾貨教你什麼叫裝飾器以及如何在訪問特性時執行代碼

兩個列子一個用了裝飾器@,一個沒用。結果是一樣子的,小夥伴們可以自己細細去品味一下其中的不同。

怎麼在訪問特性時可以執行代碼?

__getattribute__(self,name):當特性name被訪問時自動調用。

__getattr__(self,name):當特性name被訪問且對象沒有相應的特性時被自動調用。

__setattr__(self,name,value):當試圖給特性name賦值時被自動調用。

__delattr__(self,name): 當試圖刪出特性name時被調用。

注:舊式類只需要後三個。property方法不能使用舊式類實現屬性。如下圖例子

一篇乾貨教你什麼叫裝飾器以及如何在訪問特性時執行代碼

與之前的一個property的例子做對比:其實時一致的沒用的都是特性方法。

一篇乾貨教你什麼叫裝飾器以及如何在訪問特性時執行代碼

注:1. 使用__dict__為了避免__setattr__方法被再次調用,這樣程序陷入死循環(__dict__代替普通的特性賦值)

2. 對象所有特性訪問都是攔截的。 __getattribute__攔截所有特性的訪問,也攔截對__dict__的訪問!當訪問__getattribute__中所有與self相關的特性時,使用超類的__getattribute__方法(super函數),這是唯一安全途徑。


分享到:


相關文章: