類的定義
Python使用class
關鍵字來定義類
class Car:def infor(self):print("This is a car")
car = Car()
car.infor()
內置方法isinstance()
來測試一個對象是否為某個類的實例
self參數
- 類的 所有實例方法都有一個默認的
self
參數,并且必須是方法的第一個形參。但是不一定命名為self
self
參數代表將來要創建的對象(實例)本身- 在內部,訪問實例屬性需要以
self
為前綴 - 在外部,通過對象名調用對象方法時并不需要傳遞這個參數,如果在外部通過類名調用對象方法則需要顯示為
self
傳遞參數
類的成員和實例成員
- 類的成員:在類中所有方法定義之外定義的,通過類名或者對象名來訪問
- 實例成員:一般是指在構造函數
__init__()
中定義的(在其他函數中也可以,在外部定義也可以),在類內部定義和使用時必須以self
作為前綴,在類的外部必須通過對象名訪問。我們可以同時擁有相同名字的類成員和實例成員。當名字相同時根據訪問方式的不同進行區分 - 類成員是各個實例共享的,而實例成員不會共享
- 混入(mixin)機制:可以動態地為類和對象增加成員,是Python動態類型特點的重要體現
- 混入機制在大型項目開發中非常方便和實用
私有成員和公有成員
- 私有成員:以兩個下劃線
__
開頭- 在類的外部不能直接訪問,需要通過對象的公有成員方法來訪問
- 可以通過Python支持的特殊方式來訪問
- 公有成員:既可以在類的內部訪問,也可以在外部程序中使用
用下劃線作為變量名和方法名前綴和后綴表示類的特殊成員:
_XXX
受保護成員,不能用from module import *
導入__XXX__
系統定義的特殊成員__XXX
私有成員,只有類對象自己能訪問,在對象外部可以使用對象名._類名_XXX
這樣特殊的方式進行訪問
在IDLE
環境中,在對象或者類名后面加上一個圓點.
稍等一秒鐘會自動列出其所有公開成員,模塊也具有同樣的用法
在圓點.
后面再加一個下劃線則會列出該對象、類或者模塊的所有成員,包括私有成員
成員方法
- 公有方法、私有方法都屬于對象,私有方法的名字以兩個下劃線開始,每個對象都有自己的公有方法和私有方法,在這兩類方法中可以訪問屬于類和成員的對象
- 公有方法通過對象名直接調用,私有方法不能直接調用,只能再屬于對象的方法中使用
self
調用或者使用特殊的方式 - 如果通過類名來調用屬于對象的公有方法,則需要顯式為該方法傳遞self參數,用來指明訪問哪個對象的數據成員
- 靜態方法和類方法都可以用過類名和對象名調用,但不能直接訪問屬于對象的實例成員,只能訪問屬于類的成員
- 一般將
cls
作為類方法的第一個參數名稱,但也可以用其他名字作為參數,并且在調用類方法時不需要為該參數傳遞值 - 從類?法和實例?法以及靜態?法的定義形式就可以看出來,類?法的第? 個參數是類對象cls,那么通過cls引?的必定是類對象的屬性和?法;?實例 ?法的第?個參數是實例對象self,那么通過self引?的可能是類屬性、也有 可能是實例屬性(這個需要具體分析),不過在存在相同名稱的類屬性和實 例屬性的情況下,實例屬性優先級更?。靜態?法中不需要額外定義參數, 因此在靜態?法中引?類屬性的話,必須通過類對象來引?