python
類別就像一個設計圖或是輪廓。
例如要生產一輛汽車時,都會有設計圖,生產時依照這個決定汽車長什麼樣子以及有什麼功能。
類別(Class)就類似設計圖,用來定義產生物件(Object)後,該物件會有什麼屬性(Attribute)和方法(Method)。
首先會有class關鍵字,接著自定類別名稱,最後加上冒號。類別名稱的命名原則習慣上單字第一個字母大寫,每個相連的不同的單字的第一個字母也都為大寫。
透過類別(Class)建立的實體稱為物件(Object),就像實際生產出來的汽車(例如:Benz、BMW)。
用來存放物件的資料。
建立物件的屬性語法如下:
建立屬性範例:
存取物件的屬性值則透過以下語法:
存取範例:
為物件提供的功能。
定義方法和定義函式一樣都是def關鍵字開頭,接著自訂名稱,通常第一個單子的首字母為小寫,且方法必須有self參數(第一個參數),語法如下:
範例:
在類別內所有的方法第一個參數都是
self
,我們並不需要自己傳入self參數,直譯器會自動幫我們帶入,只需要從第二個參數開始傳入即可。
__init__()
方法__init()
方法可以將該類別的初始化流程都定義在裡面,該方法在建立類別物件的時候會自動被呼叫,所以不需要自行呼叫。
請注意
__init__()
方法前後都是兩個底線。
__dict__
每個類別都會有這個屬性,為一個字典(dict),可以用來取得該物建內所有的數性名稱和屬性值。
__str__
透過定義__str__()
方法,可以在該物件透過呼叫str()
函式時輸出自訂的字串,例如:
請注意,該方法一定要回傳一個字串。
__add__
定義加法運算
__sub__
定義減法運算
__mu__
定義乘法運算
__truediv__
定義除法運算
__eq__
定義「==」運算
有些類別會有一些相關的程式碼,例如:
其建構式和showStatus()方法其實程式碼都是一樣的,因此我們可以將之提取到一個類別Car:
然後讓Bus和Truck類別都繼承自Car類別:
繼承的方式也就是在類別名稱定義後面多一對小括號,並且將要繼承的類別名稱放在裡面,該Car類別也稱之為父類別;因為Bus和Truck都繼承自Car類別,因此Car類別內的方法,在Bus和Truck類別內都可以呼叫使用,Bus和Truck類別也稱之為子類別,例如:
這樣一來,如果未來showStatus()方法內的邏輯需要改變,只要修改服類別即可,而不用每個類別的方法都要修一次。
當子類別內的方法和父類別相同時,子類別的方法將會覆蓋掉父類別的方法,例如:
如果在子類別內想呼叫父類別的show()方法,可以使用super()方法,例如:
就可以呼叫父類別的show()方法。
Python提供了一個函式isinstance()來判斷類別(Class)與物件(Object)的關係,語法如下:
範例:
由於myCar並不是Motorcycle類別產生的物件實體,所以執行結果為False。
最基本的類別中的方法,其條件為:
範例:
在沒有實現__str__
方法下,如果直接print(self),可以看到,self變數內存放的就是物件,例如:
特色為:
由於類別方法(Class Method)的cls參數指向類別(Class),所以類別方法(Class Method)只能修改類別的屬性,而無法改變物件的屬性,因為它沒指向物件的self參數。
執行結果:
你也可以用
myFirstCar = Car(100, 2)
來產生一輛跑車實體物件,但當你需要在很多地方都產生跑車實體時,用類別方法來產生實體的做法會比較簡潔且不容易出錯。
特色為:
@staticmethod
裝飾詞(Decorator)的方法(Method)。靜態方法在類別中是一個獨立的方法,通常應用於方法中不需要存取物件及類別的的屬性或方法的情境,它可以透過物件或是類別來呼叫。
執行結果
- 不論透過類別或物件都可以呼叫,執行期間不會傳入self及cls參數。
- 一般會用在單元的測試。
- 因為參數不會有self或cls,所以沒有辦法存取類別或物件屬性。