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 資源
透過相關的互動式教學、備忘單和程式碼比較來擴展您的知識。