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

更新於 發佈於 閱讀時間約 7 分鐘

先前學到自定函式的使用方法,那如果在一個很龐大的程式架構中發散了一推自定函式,有沒有辦法可以整理一下,讓程式結構整齊又簡潔呢?

可以使用裝飾器staticmethod 定義靜態方法,讓相關聯的自定函式變成用類別中的靜態方法,全部整理到一個類別去,想像成是一個工具箱的概念,工具箱就是類別,靜態方法好像裡面的工具一樣,從哪個工具箱拿出這個工具,就像從哪個類別拿出靜態方法來用一樣,先有這初步的概念,讓我們從範例中更深刻理解吧。


靜態方法的特點:

  1. 靜態方法與類別的實例無關,因此它不需要訪問實例變數。
  2. 靜態方法可以訪問類別本身的屬性或方法。
  3. 只有單一實現的時候。不希望子類別覆寫該函數,確保該函數不被覆寫就可用@staticmethod

靜態方法的應用場景:

  • 當某個方法與類別相關,但不需要訪問實例變數時,可以使用靜態方法。
  • 靜態方法通常與類別相關的邏輯,但不需要實例化類別的情況下使用。

語法

staticmethod靜態方法定義方式如下:

class MyClass:
@staticmethod
def my_static_method(arg1, arg2, ...):
# 靜態方法的實現
# 這裡不能訪問實例變數,只能訪問類別變數或其他靜態成員
pass

程式範例

定義函式與靜態方法差異

在這個例子中,addmultiply 方法是靜態方法,可以直接使用類別名稱呼叫,不需要實例化 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 定義靜態方法還有沒有更好的用處,是我沒想到的

如果您知道更能發揮它的效用,在留言分享一下,謝謝





留言
avatar-img
留言分享你的想法!
avatar-img
螃蟹_crab的沙龍
149會員
293內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。 興趣是攝影,踏青,探索未知領域。 人生就是不斷的挑戰及自我認清,希望老了躺在床上不會後悔自己什麼都沒做。
螃蟹_crab的沙龍的其他內容
2025/04/25
在 Python 中,字典(dict)是非常常用的資料結構,用來儲存 key-value 配對。而在操作字典時,.setdefault() 是一個常被忽略但非常實用的方法。 這篇文章會完整介紹 .setdefault() 的語法、用途、與實務範例,幫助你更有效率地處理字典資料。 什麼是 .se
Thumbnail
2025/04/25
在 Python 中,字典(dict)是非常常用的資料結構,用來儲存 key-value 配對。而在操作字典時,.setdefault() 是一個常被忽略但非常實用的方法。 這篇文章會完整介紹 .setdefault() 的語法、用途、與實務範例,幫助你更有效率地處理字典資料。 什麼是 .se
Thumbnail
2025/01/30
Python 程式在電腦上的執行流程 當我們在電腦上執行 Python 程式時,主要經歷以下幾個步驟: 1. 編寫 Python 程式碼 開發者使用文字編輯器或 IDE(如 VS Code、PyCharm)撰寫 Python 程式,並將其存為 .py 檔案。 例如,一個簡單的 Python
Thumbnail
2025/01/30
Python 程式在電腦上的執行流程 當我們在電腦上執行 Python 程式時,主要經歷以下幾個步驟: 1. 編寫 Python 程式碼 開發者使用文字編輯器或 IDE(如 VS Code、PyCharm)撰寫 Python 程式,並將其存為 .py 檔案。 例如,一個簡單的 Python
Thumbnail
2024/10/17
在一個典型的程式專案中,UI、Controller 和 Main 的分工通常遵循 MVC 模型(Model-View-Controller) 的架構,這是一種常見的設計模式,能夠將應用程式的邏輯和界面進行分離。 大部分典型的程式專案設計: UI (View):專注於用戶界面,展示數據,並將用
Thumbnail
2024/10/17
在一個典型的程式專案中,UI、Controller 和 Main 的分工通常遵循 MVC 模型(Model-View-Controller) 的架構,這是一種常見的設計模式,能夠將應用程式的邏輯和界面進行分離。 大部分典型的程式專案設計: UI (View):專注於用戶界面,展示數據,並將用
Thumbnail
看更多
你可能也想看
Thumbnail
這篇內容,將會講解什麼是方法,以及與方法相關的知識。包括定義Method、Method Variable 方法變數、跨區使用Method、使用函式時要注意括號。
Thumbnail
這篇內容,將會講解什麼是方法,以及與方法相關的知識。包括定義Method、Method Variable 方法變數、跨區使用Method、使用函式時要注意括號。
Thumbnail
打開 jupyter notebook 寫一段 python 程式,可以完成五花八門的工作,這是玩程式最簡便的方式,其中可以獲得很多快樂,在現今這種資訊發達的時代,幾乎沒有門檻,只要願意,人人可享用。 下一步,希望程式可以隨時待命聽我吩咐,不想每次都要開電腦,啟動開發環境,只為完成一個重複性高
Thumbnail
打開 jupyter notebook 寫一段 python 程式,可以完成五花八門的工作,這是玩程式最簡便的方式,其中可以獲得很多快樂,在現今這種資訊發達的時代,幾乎沒有門檻,只要願意,人人可享用。 下一步,希望程式可以隨時待命聽我吩咐,不想每次都要開電腦,啟動開發環境,只為完成一個重複性高
Thumbnail
今天來介紹python的函式 函式在python中是非常重要的一環,因為到了後期,程式會越來越複雜。 而函式可以想成是容易管理的小程式,當我們需要使用時,只需呼叫即可。
Thumbnail
今天來介紹python的函式 函式在python中是非常重要的一環,因為到了後期,程式會越來越複雜。 而函式可以想成是容易管理的小程式,當我們需要使用時,只需呼叫即可。
Thumbnail
當我們在撰寫一套系統的時候, 總是會提供一個介面讓使用者來觸發功能模組並回傳使用者所需的請求, 而傳統的安裝包模式總是太侷限, 需要個別主機獨立安裝, 相當繁瑣, 但隨著時代的演進與互聯網的崛起, 大部分的工作都可以藉由網頁端、裝置端來觸發, 而伺服端則是負責接收指令、運算與回傳結果, 雲端
Thumbnail
當我們在撰寫一套系統的時候, 總是會提供一個介面讓使用者來觸發功能模組並回傳使用者所需的請求, 而傳統的安裝包模式總是太侷限, 需要個別主機獨立安裝, 相當繁瑣, 但隨著時代的演進與互聯網的崛起, 大部分的工作都可以藉由網頁端、裝置端來觸發, 而伺服端則是負責接收指令、運算與回傳結果, 雲端
Thumbnail
在 Python 中,dir() 函式用於列舉對象的所有屬性和方法。這包括對象的內建屬性、方法以及自定義的屬性和方法。以下是一個簡單的示例: 列舉所有屬性與方法 class MyClass: def __init__(self): self.attribute1 = 42
Thumbnail
在 Python 中,dir() 函式用於列舉對象的所有屬性和方法。這包括對象的內建屬性、方法以及自定義的屬性和方法。以下是一個簡單的示例: 列舉所有屬性與方法 class MyClass: def __init__(self): self.attribute1 = 42
Thumbnail
前幾篇討論到各種裝飾器的用法,本文將介紹另外一種裝飾器,可以將方法轉換成屬性來使用。 property也可以動態的取出物件的值,隨著時間或其他運算改變所產生的值,讓我們繼續往下看更多介紹吧。
Thumbnail
前幾篇討論到各種裝飾器的用法,本文將介紹另外一種裝飾器,可以將方法轉換成屬性來使用。 property也可以動態的取出物件的值,隨著時間或其他運算改變所產生的值,讓我們繼續往下看更多介紹吧。
Thumbnail
先前我們談論到靜態方法就像是定義工具箱一樣,那麼抽象方法就像是共用表格的概念,例如註冊帳號時會填寫的一些基本資料,就有包含制式的表格,裡面有需填寫的欄位,例如姓名,性別等。
Thumbnail
先前我們談論到靜態方法就像是定義工具箱一樣,那麼抽象方法就像是共用表格的概念,例如註冊帳號時會填寫的一些基本資料,就有包含制式的表格,裡面有需填寫的欄位,例如姓名,性別等。
Thumbnail
先前學到自定函式的使用方法,那如果在一個很龐大的程式架構中發散了一推自定函式,有沒有辦法可以整理一下,讓程式結構整齊又簡潔呢? 可以使用裝飾器staticmethod 定義靜態方法,全部整理到一個類別去,想像成是一個工具箱的概念,工具箱就是類別,靜態方法就像是裡面的工具一樣。
Thumbnail
先前學到自定函式的使用方法,那如果在一個很龐大的程式架構中發散了一推自定函式,有沒有辦法可以整理一下,讓程式結構整齊又簡潔呢? 可以使用裝飾器staticmethod 定義靜態方法,全部整理到一個類別去,想像成是一個工具箱的概念,工具箱就是類別,靜態方法就像是裡面的工具一樣。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News