11.Python 類別 (Class)
日期:2024/04/09
11.Python 類別 (Class)
『物件導向程式設計』(Object-oriented programming, OOP) 是一種程式開發的概念,以物件的概念來解決問題。
封裝、繼承、多型為物件導向的三大特性,本章節會略提此概念,建議後續抽空學習物件導向程。
11.1 類別 (Class)
在 Python 中,類別 (Class) 是用來創建物件又稱實例 (Instance)的藍圖或模板。類別定義了物件的屬性 (資料) 和方法 (函式),它們描述了物件的特徵和行為。通過定義類別,我們可以創建多個具有相同屬性和方法的物件。

基本語法
class ClassName:# 屬性# 方法passclassName = ClassName()
- 類別名稱為 ClassName ,通常使用大寫做開頭。
- 建立物件時習慣將開頭的大寫轉小寫表示。
- 屬性:以變數的形式呈現。
- 方法:以函式的形式呈現。
class Rectangle:width = 1height = 1def area(self):return self.width * self.heightrectangle = Rectangle() # 實例化rectangle.height = 2 # 更改物件屬性print(rectangle.area()) # 執行方法# 2
物件的初始設定
當 class 定義了__init__() method,class 實例化會為新建的 class 實例自動調用__init__()。在產生物件時可以一併設定屬性:
class Rectangle:def __init__(self, width, height):self.width = widthself.height = heightdef area(self):return self.width * self.heightrectangle = Rectangle(2, 6) # 實例化rectangle.height = 3 # 更改物件屬性print(rectangle.area()) # 執行方法# 6
Method 物件
我們一樣使用 Rectangle 類別做示範:
area1 = rectangle.areaprint(area1())
這次我們呼叫方法時沒有加上任何參數在此為(),表示此時函式尚未執行,等需要時在加上參數。
具體的應用場景可能為,在程式碼的某些部分需要指定執行的函數,因此,先定義一個函數引用,然後在需要的時候再呼叫它並傳入參數。
11.2 繼承 (Inheritance)
基本語法
class ClassName(ParentClass):# 屬性# 方法pass
ParentClass:繼承類別的名稱 (稱為「父類別」,Parent class)- 可多重繼承:
class ClassName(ParentClass1, ParentClass2)
函式
我們先假設有以下兩個 Class:
class A:passclass B(A):pass
isinstance(object, classinfo):用於判斷類別及物件的關係。obj = B()print(isinstance(obj, B)) # Trueprint(isinstance(obj, A)) # True
issubclass(classinfo1, classinfo2):用於判斷類別是否為另一類別的子關係。print(issubclass(B, A)) # True
11.3 Override (覆寫)
Override (覆寫) 是指子類別重新定義 (覆蓋) 父類別中的方法,使該方法擁有不同於父類別的行為。
class Parent:def show(self):print("父類別的 show 方法")class Child(Parent):def show(self):print("子類別的 show 方法")obj = Child()obj.show() # 子類別的 show 方法
11.4 Overload (多載)
Python 不直接支援方法多載。方法多載是指在同一個類別中定義多個同名方法,但這些方法的參數類型或數量不同。在 Python 中,由於 Python 的動態特性,同一個類別中只能存在一個方法名相同的方法,即後面定義的方法會覆蓋前面定義的方法,而不會產生方法多載。
當然這只是意義上的不行,我們可以透過一些方式達成相似的結果。
方法 1:透過參數的控制,是否還記得位置參數、關鍵字參數、默認參數、*args 與 **kwargs
def greet(**kwargs):if 'name' in kwargs:print('Hello, ' + kwargs['name'])else:print('Hello, World')greet() # 輸出: Hello, Worldgreet(name="Alice") # 輸出: Hello, Alice
方法 2:透過multipledispatch 套件中的裝飾器@dispatch(),目前先看過去即可後續章節會介紹裝飾器。
from multipledispatch import dispatch@dispatch(int, int)def add(x, y):return x + y@dispatch(float, float)def add(x, y):return x + y@dispatch(str, str)def add(x, y):return x + yprint(add(1, 2)) # 3print(add(1.5, 2.5)) # 4.0print(add('Hello, ', 'World')) # Hello, World
當然還有其他方式及套件歡迎自行探索。
11.5 Polymorphism (多型)
多型是指相同的操作或函式在不同的物件上可以有不同的行為。具體來說,多型允許將父類別的引用指向子類別的物件,從而以統一的方式使用不同類別的物件。多型通過對繼承、覆寫等機制的合理應用來實現。
class Animal:def makeSound(self):passclass Fox(Animal):def makeSound(self):return "叮叮叮"class Cat(Animal):def makeSound(self):return "喵喵"class Mushroom(Animal):def makeSound(self):return "蘑菇 蘑菇"def animalSound(animal):print(animal.makeSound())fox = Fox()cat = Cat()mushroom = Mushroom()animalSound(fox) # 叮叮叮animalSound(cat) # 喵喵animalSound(mushroom) # 蘑菇 蘑菇
