Python 自學第十一天:Class 類別
Class 類別主要用來定義封裝的變數和函式 (又稱作屬性)。定義類別名稱時,習慣首字大寫。可以分成靜態類別、一般類別和兩者混用類別。
靜態類別,不需要實體物件
定義
在 Class 中定義屬性,不需要 self
關鍵字。
基本語法如下:
1 | class 類別名稱: |
舉例:
1 | class MyDog: |
使用
定義完之後,直接使用 類別名稱.屬性名稱
呼叫屬性。
1 | my_dogs = MyDog.types |
一般類別,需要實體物件
定義
在 Class 中定義
- 創造實體的初始化函式,使用
__init__()
和self
關鍵字。在區塊中定義物件的變數 (需要物件才能呼叫的變數)。 - 會和物件綁在一起的函式,需要
self
關鍵字。也就是物件的函式 (需要物件才能呼叫的函式)。
基本語法如下:
1 | class 類別名稱: |
舉例:
1 | class Dog: |
使用
定義完之後:
-
先利用
自訂物件名稱 = 類別名稱(參數1, 參數2, ...)
創造物件實體。例如:my_dog = Dog(types參數, size參數, age參數)
。不需要傳入self參數
。 -
再使用
自訂物件名稱.變數
、自訂物件名稱.函式(參數a, ...)
呼叫物件的屬性。不需要傳入self參數
。
1 | dog1 = Dog("哈士奇", "大型犬", 2) # 創造物件實體 |
值得注意的是,如果我使用 類別名稱.屬性名稱
會出現如下錯誤:
1 | Dog.types |
咦!咦!
-
為什麼 Dog 類別沒有
types
屬性?
因為types
是物件的變數,show()
也是物件的函式。如果用類別呼叫,程式無法找到類別的types
和show()
,自然就會報錯。 -
前面不是提到,不需要傳入
self參數
,為什麼又說少一個必要的參數self
呢?
因為定義函式時,第一個參數self
其實表示的是物件實體。如下圖,使用dog1.
呼叫show()
時,就表示dog1
被當作self參數
傳入。
所以想使用 類別名稱
呼叫函式,需要傳入 self
參數,改寫成這樣:
1 | dog1 = Dog("哈士奇", "大型犬", 2) |
兩者混用
在 Class 中定義屬性:想要和物件綁在一起的變數和函式就加 self
關鍵字。反之,則不加。直接來看以下的舉例。
定義
在狗的類別中:
- 定義只有四種狗屬於寵物狗,以 Set 型態表示。不限定於某個狗實體才有的特徵,以
Dog.pet_types
或物件.pet_types
呼叫。 - 定義創造實體的初始化函式,使用
__init__()
和self
關鍵字,在區塊中定義物件的變數。限定於某個狗實體才有的特徵,以物件.變數名稱
呼叫。 - 定義只要是狗都會吠叫的函式
bark()
。不限定於某個狗實體才會的功能,以Dog.bark()
呼叫。 - 定義會和物件綁在一起的函式
show()
,需要self
關鍵字,也就是物件的函式。限定於某個狗實體才會的技能,以物件.show()
呼叫。
1 | class Dog: |
使用
1 | print(Dog.pet_types) # 寵物狗的類型 |
注意,非物件的變數以 類別.pet_types
或 物件.pet_types
呼叫都可以。可是,非物件的函式以 物件.bark()
呼叫會報錯。
1 | his_dog2.bark() |
它說因為 bark()
不需要參數,但是我有給它一個參數 his_dog2物件
,所以不對。
如果希望 實體物件
也可以使用 物件名稱
呼叫非物件的函式,也就是靜態函式,則定義時要在函式上方增加 @staticmethod
,如下:
1 | class Dog: |
因為有明確告知 python,bark()
是靜態函式,即使使用 物件名稱
呼叫,也可以達成。
1 | his_dog2.bark() |
參考資料:
彭彭的課程:Python 類別的定義與使用
彭彭的課程:Python 實體物件的建立與使用 - 上篇 - 實體屬性 Instance Attributes
彭彭的課程:Python 實體物件的建立與使用 - 下篇 - 實體屬性 Instance Attributes