Python中的抽象類別

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的抽象方法。此方法必須在子類別中具體實現。DogCat繼承自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))  # False

isinstance() 用於檢查物件是否為指定類別的實例,而 issubclass() 用於檢查類別是否為指定類別的子類別。

總結

透過使用 abc 模組設計抽象類別,可以明確類別之間的介面並強制實現必要的方法和屬性。這有助於保持程式碼的一致性並減少錯誤,對於大型專案尤其有用。

抽象類別是 Python 中一個重要的工具,可以支持靈活的面向物件編程,提升類別的可重用性和可維護性。

您可以在我們的 YouTube 頻道上使用 Visual Studio Code 來跟隨上述文章一起學習。 請也查看我們的 YouTube 頻道。

YouTube Video