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