Python class 的使用時機

大家好,最近教學時常被問到,為什麼需要了解/學習 Python 中的 Class 的撰寫方式與時機。

由於我很少寫 Class,所以想問看看大家,是否有比較前顯易懂的方式,比較容易講解給沒接觸過程式語言的學生呢?感謝

我是比較少寫 python :sweat_smile:
我從 C++ 或者說物件導向來試試看

class 最直接的好處,可以使用自己所儲存的資料
例如今天一條狗會有身高、身長、體重、名字
要寫些好幾個函數需要用到這些資料

func_1(身高, 身長, 體重, 名字);
func_2(身高, 身長, 體重, 名字);
...

但如果寫成 class 把這些資料存在裡頭,在寫他的成員函數,就不需要再傳入這些參數
self.身高 等取用
另外的好處,再寫的過程就可以知道取用的身高是從哪裡的,不會將狗 A 或狗 B 混在一起
(當然,從另一方面來講這樣的函數就少了彈性讓你可以直接混用)
也不用寫

A_height = ...;
A_name = ...;
B_height = ...;
B_name = ...;

而直接用

A = (height, ..., name);
B = (height, ..., name);

還有繼承
例如只要給好身寬高,就能知道讓寵物進出的門要選用哪個 (例子有點爛XD)
那就可以在狗這個類別下,先寫好這個函數以及他應該要有這些基本資料
再來,柴犬或者是哈士奇,他們都繼承狗類別,然後再對於他們比較不同的地方分別在寫函數
但由於他們都繼承狗類別,初始化處理好時,“寵物進出的門要選用哪個” 就已經從狗類別實現了。
(C++,我不確定 python) 另外也可以指定一定要實現的函數
例如我知道狗會跑,但我不知道它們分別地奔跑時速;此時,我只要在狗類別宣告 “奔跑時速”,但不實作 (virtual = 0 in C++),在寫柴犬類別時,根據柴犬的狀況實作 “奔跑時速”,在哈士奇也是同理
在 C++ 中,像這樣沒有實作對應的函式時,在編譯期間就會跳錯
後半段某種程度可以是 feature 的用法,把類別當功能類別來用,有繼承就代表有該項功能

class 可以把資料包裝好,減少各子類別實作,而子類別只需要專注在他們獨特的地方
雖然只寫函數也可以做好上述的事情,但 class 可以幫你把這些分割開來,而非都是函式而已
當然 class 不只上面講的這些,但這些應該是最簡單直觀的 class 用法或好處