先前學到自定函式的使用方法,那如果在一個很龐大的程式架構中發散了一推自定函式,有沒有辦法可以整理一下,讓程式結構整齊又簡潔呢?
可以使用裝飾器staticmethod 定義靜態方法,讓相關聯的自定函式變成用類別中的靜態方法,全部整理到一個類別去,想像成是一個工具箱的概念,工具箱就是類別,靜態方法好像裡面的工具一樣,從哪個工具箱拿出這個工具,就像從哪個類別拿出靜態方法來用一樣,先有這初步的概念,讓我們從範例中更深刻理解吧。
靜態方法的特點:
@staticmethod
靜態方法的應用場景:
staticmethod
靜態方法的定義方式如下:
class MyClass:
@staticmethod
def my_static_method(arg1, arg2, ...):
# 靜態方法的實現
# 這裡不能訪問實例變數,只能訪問類別變數或其他靜態成員
pass
在這個例子中,add
和 multiply
方法是靜態方法,可以直接使用類別名稱呼叫,不需要實例化 MathUtils
。
靜態方法可以防止全局命名衝突。這種方式還允許在 MathUtils 類別中添加更多相關的靜態方法,以實現更多相關的功能,例如創建一個自己專屬的數學工具庫。
在此範例中result2 = MathUtils.multiply(4, 6)
MathUtils就是我們的工具箱,拿出了multiply這個工具來作使用。
# 使用函式定義實現相關功能
def add(x, y):
return x + y
def multiply(x, y):
return x * y
# 使用模塊層級的函式
result1 = add(5, 3)
result2 = multiply(4, 6)
print(result1) # 輸出: 8
print(result2) # 輸出: 24
# 使用靜態方法實現相同的功能
class MathUtils:
@staticmethod
def add(x, y):
return x + y
@staticmethod
def multiply(x, y):
return x * y
# 使用靜態方法,不需要實例化類別
result1 = MathUtils.add(5, 3)
result2 = MathUtils.multiply(4, 6)
print(result1) # 輸出: 8
print(result2) # 輸出: 24
靜態方法通常用於與類別相關但與實例狀態無關的操作,
類別方法通常用於需要訪問或修改類別屬性的操作。
靜態方法 square_area
:使用@staticmethod
裝飾器修飾。
通過類別名稱 MathOperations 調用,不需要實例化。
該方法接受一個參數 side_length
,計算正方形的面積並返回結果。
類別方法 circle_area
:使用 @classmethod
裝飾器修飾。
通過類別名稱 MathOperations 來調用,不需要實例化。
該方法接受兩個參數,cls 代表類別本身,radius
是計算圓形面積所需的半徑。
該方法使用了類別屬性 pi,並計算圓形的面積。
class MathOperations:
# 類別屬性
pi = 3.14
# 靜態方法:計算正方形面積
@staticmethod
def square_area(side_length):
return side_length ** 2
# 類別方法:計算圓形面積
@classmethod
def circle_area(cls, radius):
return cls.pi * radius ** 2
# 使用靜態方法,無需實例化
square_result = MathOperations.square_area(5)
# 使用類別方法,需使用類別名稱
circle_area_result = MathOperations.circle_area(2)
print(square_result) # 輸出: 25
print(circle_area_result) # 輸出: 12.56
當靜態方法提供一些通用的、與類別相關的操作時,其他類別也可以輕鬆調用這些方法。
我們創建了兩個產品,分別是一台筆記型電腦和一部智能手機。
通過 display_price_in_local_currency 方法,我們可以將這兩個產品的價格以本地貨幣的形式顯示。
class CurrencyConverter:
exchange_rate = 1.1 # 貨幣兌換率(假設 1 單位的本地貨幣等於 1.1 單位的外幣)
@staticmethod
def convert_to_foreign_currency(amount):
return amount * CurrencyConverter.exchange_rate
class Product:
def __init__(self, name, price):
self.name = name
self.price = price
def display_price_in_local_currency(self):
local_price = CurrencyConverter.convert_to_foreign_currency(self.price)
print(f"{self.name} 在當地價格是: {local_price}")
# 使用範例
product1 = Product("Laptop", 1000)
product2 = Product("Smartphone", 500)
product1.display_price_in_local_currency() # 輸出 Laptop 在當地價格是: 1100.0
product2.display_price_in_local_currency() # 輸出 Smartphone 在當地價格是: 550.0
這個範例中,CurrencyConverter
提供了一個通用的靜態方法,可以在整個應用程序中重複使用,而不需要實例化類別。Product
類別則使用了這個通用的靜態方法,以實現價格的轉換和顯示。這種結構使得代碼更加模組化和可維護。
在整理學習時,也在想裝飾器staticmethod 定義靜態方法還有沒有更好的用處,是我沒想到的