2024-01-27|閱讀時間 ‧ 約 26 分鐘

[Python基礎]裝飾器AbstractMethods 定義抽象方法

[Python基礎]裝飾器staticmethod 定義靜態方法

先前我們談論到靜態方法就像是定義工具箱一樣,那麼抽象方法就像是共用表格概念,例如註冊帳號時會填寫的一些基本資料,就有包含制式的表格,裡面有需填寫的欄位,例如姓名性別等。

那麼真正要撰寫整個程式架構時,若在履歷表的格式中,少了姓名性別的欄位糟糕了,就需要用到這抽象方法先約定好,一定要包含姓名跟性別的方法存在。


抽象方法舉例圖

Abstract Method: 就跟它的名字一樣,是一個抽象的類,很抽象不能實例化(instance),只能被子類別繼承


語法

在 Python 中,抽象基類的定義通常使用 abc 模組中的 ABC 類和 abstractmethod 裝飾器

from abc import ABC, abstractmethod

# 定義抽象基類
class Shape(ABC):
@abstractmethod
def area(self):
"""抽象方法,表示計算形狀面積的操作"""
pass

抽象方法的實現@abstractmethod抽象方法是一種在父類別中聲明但在該類別中不提供實現的方法,目的是讓子類別來實現這些方法。

強調規範和約定:抽象方法的存在是一種約定,告訴子類別必須實現這些方法,這有助於提高程式碼的可讀性和可維護性。

解釋多型性:當多個不同的類別實現相同的抽象方法時,我們可以使用這些類別的實例來調用相同的方法,這種概念是多型性的一部分


程式範例

定義抽象基類 : 定義抽象基底類別 (ABC)

這個例子可以幫助理解抽象方法的概念和作用,即通過抽象方法,我們可以在父類別Shape中定義一個約定,讓子類別來CircleSquare實現具體方法邏輯。

from abc import ABC, abstractmethod

# 定義抽象基類 Shape
class Shape(ABC):
@abstractmethod
def area(self):
"""抽象方法,表示計算形狀面積的操作"""
pass

# 子類別 Circle 實現 Shape 抽象方法
class Circle(Shape):
def __init__(self, radius):
self.radius = radius

def area(self):
return 3.14 * self.radius ** 2

# 子類別 Square 實現 Shape 抽象方法
class Square(Shape):
def __init__(self, side_length):
self.side_length = side_length

def area(self):
return self.side_length ** 2

# 使用子類別
circle_instance = Circle(radius=5)
square_instance = Square(side_length=4)

# 調用抽象方法 area(),由子類別實現具體的邏輯
circle_area = circle_instance.area()
square_area = square_instance.area()

# 輸出結果
print(f"Circle Area: {circle_area}") # Circle Area: 78.5
print(f"Square Area: {square_area}") # Square Area: 16

那如果,我們繼承了抽象基類,不履行約定會發生什麼事?

我們試著將子類別Squaredef area(self):拿掉看看會發生什麼事。

這個錯誤是因為嘗試實例化一個抽象基類 Square,但是 Square 沒有實現抽象方法 area。在抽象基類中,包含抽象方法的子類別必須實現這些方法,否則無法實例化,就會像我們上述所說的有一個約定在。


總結

定義通用介面:抽象方法(Abstract Method)通常應用於定義各類別共同介面,讓未來要增加的需求功能,必須遵守共同的規則,來達到各類別擁有一致性的介面,不但好維護易於擴充

強制子類別實現: 抽象方法確保子類別實現了特定的行為,這有助於提高程式碼的可靠性和穩定性。


下次有需要用到共同方法時,試著用抽象基底類別與抽象方法吧


分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.