[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
中定義一個約定,讓子類別來Circle
與Square
實現具體的方法邏輯。
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
那如果,我們繼承了抽象基類,卻不履行約定會發生什麼事?
我們試著將子類別Square
的def area(self):
拿掉看看會發生什麼事。
這個錯誤是因為嘗試實例化一個抽象基類 Square,但是 Square 沒有實現抽象方法 area。在抽象基類中,包含抽象方法的子類別必須實現這些方法,否則無法實例化,就會像我們上述所說的有一個約定在。
定義通用介面:抽象方法(Abstract Method)通常應用於定義各類別的共同介面,讓未來要增加的需求功能,必須遵守共同的規則,來達到各類別擁有一致性的介面,不但好維護且易於擴充。
強制子類別實現: 抽象方法確保子類別實現了特定的行為,這有助於提高程式碼的可靠性和穩定性。