今天我們首先說一說靜態方法和類成員方法。
靜態方法(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函數),這是唯一安全途徑。
閱讀更多 孩子早知道 的文章