Python OOP 多態性:鴨子類型和介面

掌握 Python 中的多態性。了解如何使用鴨子類型、方法重寫和抽象基底類別編寫靈活、鬆散耦合的程式碼。

在編輯器中嘗試

概述

多態性是希臘術語,意思是「多種形式」。在物件導向程式設計中,它指的是不同類別以自己獨特的方式回應相同方法呼叫的能力。多態性可讓您編寫一個可以處理許多不同類型的物件的函數,前提是它們共用一個公共介面。這可以實現低耦合,並使您的軟體系統具有高度適應性且易於擴展。

在 Python 中,多態性與鴨子類型 (Duck Typing) 的概念密切相關。這個術語來自這樣一句話:「如果它走起來像鴨子,嘎嘎叫起來像鴨子,那麼它一定是鴨子。」在動態類型的 Python 中,函數並不關心物件屬於哪個類別;它只關心物件屬於哪個類別。它只關心該物件是否實現了請求的方法。例如,如果您有一個呼叫「.speak()」的函數,您可以向它傳遞一隻狗、一隻貓或一個機器人——只要它們都有一個「.speak()」方法,程式碼就可以完美運行。

對於更嚴格的架構,Python 透過內建的「abc」模組提供抽象基底類別(ABC)。透過繼承「abc.ABC」並使用「@abstractmethod」裝飾器,您可以定義強制子類別實作的正式介面。如果子類別未能定義抽象方法,當您嘗試實例化它時,Python 將引發 TypeError。平衡靈活的鴨子類型與正式的抽象類別是設計彈性 Python 庫的關鍵技能。

程式碼和執行輸出

實現表示計算面積的形狀的多型類別。

polymorphism_demo.py
在編輯器中嘗試
from abc import ABC, abstractmethod

class Shape(ABC):
    @abstractmethod
    def area(self):
        """Must be implemented by subclasses."""
        pass

class Square(Shape):
    def __init__(self, side):
        self.side = side
    def area(self):
        return self.side * self.side

class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius
    def area(self):
        import math
        return math.pi * (self.radius ** 2)

# Polymorphic function accepting any Shape
def print_area(shape: Shape):
    print(f"Calculated Area: {shape.area():.2f}")

print_area(Square(4))
print_area(Circle(3))
端子輸出
Calculated Area: 16.00
Calculated Area: 28.27

逐步實施

  • 編寫處理 CreditCard、PayPal 和 Stripe 物件的支付處理器
  • 使用統一的渲染循環繪製各種元素(文字、圖像)
  • 在單元測試期間模擬外部 API 連接

常見問題解答

什麼是鴨子打字?

它是Python 的多態性動態方法。它在運行時檢查方法和屬性是否存在,而不是驗證來自特定父類別的繼承。

你能實例化一個抽象基底類別嗎?

不可以。嘗試實例化繼承自 ABC 並包含抽象方法的類別將引發 TypeError。

相關主題

推薦的 Python 資源

透過相關的互動式教學、備忘單和程式碼比較來擴展您的知識。