Python中的抽象類別
本文將解釋Python中的抽象類別。
我們將使用abc模組解釋抽象類別的基本機制,提供實用範例,並附上相關程式碼進行說明。
YouTube Video
Python中的抽象類別
Python的abc模組(抽象基類)是標準庫的一部分,用於定義抽象類別,提供了類別應該實現的方法範本。使用此模組可以增強類別設計的靈活性和穩健性。
什麼是抽象類別?
抽象類別是用於為具體(可實例化的)類別定義通用介面的類別。抽象類別本身不能被實例化;必須在派生(子)類別中提供具體實現。
abc模組允許您定義抽象方法或屬性,並強制其在繼承的類別中實現。如果有任何一個抽象方法未被實現,該類別將無法被實例化。
如何使用abc模組
要使用abc模組建立抽象類別,需要繼承自ABC類別,並使用@abstractmethod裝飾器定義抽象方法。
1from abc import ABC, abstractmethod
2
3# Definition of the abstract base class
4class Animal(ABC):
5
6 @abstractmethod
7 def sound(self):
8 pass
9
10# Concrete implementation in the subclass
11class Dog(Animal):
12 def sound(self):
13 return "Woof!"
14
15class Cat(Animal):
16 def sound(self):
17 return "Meow!"在此,Animal類別被定義為抽象類別,並包含一個名為sound的抽象方法。此方法必須在子類別中具體實現。Dog和Cat繼承自Animal,並分別實現了sound方法。
實例化抽象類別
抽象類別無法直接被實例化。例如,嘗試直接實例化Animal類別將導致錯誤。
1animal = Animal() # TypeError: Can't instantiate abstract class Animal with abstract methods sound- 當嘗試實例化抽象類別時,Python會檢查是否有未實現的抽象方法,然後拋出
TypeError錯誤。如果所有必要的抽象方法都在子類別中實現,則可以實例化該類別。
多個抽象方法
類別中也可以擁有多個抽象方法。除非在子類別中實現所有的抽象方法,否則該類別將仍然是抽象類別。
1from abc import ABC, abstractmethod
2
3class Vehicle(ABC):
4
5 @abstractmethod
6 def start_engine(self):
7 pass
8
9 @abstractmethod
10 def stop_engine(self):
11 pass
12
13class Car(Vehicle):
14 def start_engine(self):
15 return "Car engine started"
16
17 def stop_engine(self):
18 return "Car engine stopped"在此範例中,Vehicle 類別擁有兩個抽象方法,而 Car 類別只有在實現這兩個方法後才能被實例化。
定義抽象屬性
abc 模組不僅支持抽象方法,還支持抽象屬性。這允許在派生類別中強制實現屬性。
1from abc import ABC, abstractmethod
2
3class Shape(ABC):
4
5 @property
6 @abstractmethod
7 def area(self):
8 pass
9
10class Circle(Shape):
11 def __init__(self, radius):
12 self.radius = radius
13
14 @property
15 def area(self):
16 return 3.14159 * (self.radius ** 2)- 在此範例中,
Shape類別有一個抽象屬性area,而子類別Circle實現了這個屬性。通過使用抽象類別來強制屬性的實現,有助於保持程式碼的一致性。
使用 isinstance() 和 issubclass()
通過使用抽象類別,可以透過 isinstance() 或 issubclass() 確認類別的繼承關係,從而提升程式碼的安全性和靈活性。
1from abc import ABC, abstractmethod
2
3# Definition of the abstract base class
4class Animal(ABC):
5
6 @abstractmethod
7 def sound(self):
8 pass
9
10# Concrete implementation in the subclass
11class Dog(Animal):
12 def sound(self):
13 return "Woof!"
14
15class Cat(Animal):
16 def sound(self):
17 return "Meow!"
18
19class Vehicle(ABC):
20
21 @abstractmethod
22 def start_engine(self):
23 pass
24
25 @abstractmethod
26 def stop_engine(self):
27 pass
28
29class Car(Vehicle):
30 def start_engine(self):
31 return "Car engine started"
32
33 def stop_engine(self):
34 return "Car engine stopped"
35
36print("Dog() is an Animal? -> ", isinstance(Dog(), Animal)) # True
37print("Dog is subclass of Animal? -> ", issubclass(Dog, Animal)) # True
38print("Cat() is a Vehicle? -> ", isinstance(Cat(), Vehicle)) # Falseisinstance() 用於檢查物件是否為指定類別的實例,而 issubclass() 用於檢查類別是否為指定類別的子類別。
總結
透過使用 abc 模組設計抽象類別,可以明確類別之間的介面並強制實現必要的方法和屬性。這有助於保持程式碼的一致性並減少錯誤,對於大型專案尤其有用。
抽象類別是 Python 中一個重要的工具,可以支持靈活的面向物件編程,提升類別的可重用性和可維護性。
您可以在我們的 YouTube 頻道上使用 Visual Studio Code 來跟隨上述文章一起學習。 請也查看我們的 YouTube 頻道。