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

更新於 2024/01/26閱讀時間約 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
128會員
209內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
螃蟹_crab的沙龍 的其他內容
在使用類別創建實例時,輸入的屬性的都要定義好資料型態,例如dog_1 = Dog("Buddy", 3),有沒有輸入一段字串讓他自己判斷的方法阿? 有的就是使用classmethod: classmethod 是一種裝飾器,它用於定義類別方法。類別方法與實例方法不同,它們被綁定到類別而不是實例。
當你想讓原本函式新增其他功能,又不想更動原本函式時,Python提供了一種強大而靈活的工具,那就是裝飾器。 但對於新手來說這個裝飾器,非常抽象難以理解,讓我們繼續往下看,慢慢的抽絲剝繭吧。 在 Python 中,使用「@」當做裝飾器使用的語法糖符號
在人與人溝通之間,最怕雞同鴨講,彼此不對頻的狀況常會造成誤會。在程式語言中也會出現類似的情況,所以就有一些約定來彼此約束。 PEP 8 是 Python 社群廣泛遵循的一種風格指南,用於提高 Python 程式碼的可讀性和一致性。一開始是 Python 之父 Guido van Rossum 自己
在Python函式中,可以使用None來指定動態的預設引數,使用更靈活,Docstrings同時能夠提供清晰的文檔。本篇文章說明利用這種方式來讓函式更彈性,輸入不同型態的關鍵字引數,並在事件紀錄時間的Log訊息的範例中詮釋,可自行輸入時間或者預設導入系統的時間,在跟其他程式交握時,可以更靈活的應用。
本文介紹了Python中函式引數的*args和**kwargs用法,通過*args處理可變數量的位置引數,通過**kwargs處理可變數量的關鍵字引數。不僅介紹了相應的語法和程式範例,還解釋了它們的順序問題和建議的慣例用法。
本文介紹了串列運算式的應用,以及與Lambda匿名函式方法的比較,並提供了程式範例。串列運算式提供了一種簡潔的語法,用於創建、轉換和過濾列表。lambda函式用於創建匿名函式,通常用於簡單的操作。建議在比較複雜的情況下使用一般for迴圈加if來表示。
在使用類別創建實例時,輸入的屬性的都要定義好資料型態,例如dog_1 = Dog("Buddy", 3),有沒有輸入一段字串讓他自己判斷的方法阿? 有的就是使用classmethod: classmethod 是一種裝飾器,它用於定義類別方法。類別方法與實例方法不同,它們被綁定到類別而不是實例。
當你想讓原本函式新增其他功能,又不想更動原本函式時,Python提供了一種強大而靈活的工具,那就是裝飾器。 但對於新手來說這個裝飾器,非常抽象難以理解,讓我們繼續往下看,慢慢的抽絲剝繭吧。 在 Python 中,使用「@」當做裝飾器使用的語法糖符號
在人與人溝通之間,最怕雞同鴨講,彼此不對頻的狀況常會造成誤會。在程式語言中也會出現類似的情況,所以就有一些約定來彼此約束。 PEP 8 是 Python 社群廣泛遵循的一種風格指南,用於提高 Python 程式碼的可讀性和一致性。一開始是 Python 之父 Guido van Rossum 自己
在Python函式中,可以使用None來指定動態的預設引數,使用更靈活,Docstrings同時能夠提供清晰的文檔。本篇文章說明利用這種方式來讓函式更彈性,輸入不同型態的關鍵字引數,並在事件紀錄時間的Log訊息的範例中詮釋,可自行輸入時間或者預設導入系統的時間,在跟其他程式交握時,可以更靈活的應用。
本文介紹了Python中函式引數的*args和**kwargs用法,通過*args處理可變數量的位置引數,通過**kwargs處理可變數量的關鍵字引數。不僅介紹了相應的語法和程式範例,還解釋了它們的順序問題和建議的慣例用法。
本文介紹了串列運算式的應用,以及與Lambda匿名函式方法的比較,並提供了程式範例。串列運算式提供了一種簡潔的語法,用於創建、轉換和過濾列表。lambda函式用於創建匿名函式,通常用於簡單的操作。建議在比較複雜的情況下使用一般for迴圈加if來表示。
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
Python 提供了一個功能豐富的標準函式庫,其中 random 專門用於生成隨機數。本文將介紹 random 的基本介紹,以及函式應用。
Thumbnail
Dictionary(字典) : 是一個可以用來存放不同資料(不同型態)的容器(集合) 每一個元素都是以{鍵(Key):值(Value)}所構成,字典中每個項目都是用","隔開
Thumbnail
在如今的資訊時代,如何有效的獲取並處理數據,成為了許多專業人士和企業的重要需求,爬蟲技術,作為獲取網絡數據的重要工具,其重要性不言而喻,而這篇文章將分享Python爬蟲的基礎,讓你能獲取想要的網頁數據。
Thumbnail
Python 基本語法 python 語法的後綴名是以.py 結尾 python 執行方式 使用交互介面執行 使用 python test.py 命令執行 使用./test.py 執行 python 標示符 以單下劃線開頭的屬性,表示是類的私有屬性(包括方法,變量)。如:_foo表示不能直接訪問的類
詳細原碼: https://reurl.cc/ex8lZm hello world Variable (變數) 輸入 input() 四則運算 列表 list (陣列) 集合 字典(Dictionary) 給值 try 檢驗 取所有值 判斷式 If else 迴圈 Switch //字典方式 CSV
Thumbnail
每個人都有自己檢視個股好壞的方式,但總是希望每次在查詢時,如果能一鍵就檢視完成那該有多好。今天我們就來學習如何製作一份地雷股檢視圖,學會後就能夠如法炮製,製作自己的一鍵檢視清單,不用再上網依靠其他網站手動檢查,可以省下一大段時間,又能及時了解要投資的個股好壞,以便能適時做出買賣決策
Thumbnail
在先前的教學中,我都教大家程式寫完以後就架設到「Heroku」的雲端上做使用,但如果你想嘗試其他自創的功能,這時一定會需要一直Debug,如果每次想看結果都要部屬一次Heroku,那這樣就變得相當麻煩,所以今天我就教大家如何利用本機端來提供外網連接的方式吧!!
Thumbnail
「VSCode 是世上最棒的 IDE 了吧」這時有人跳出來表示不服,定睛一看原來是那陳年的大哥 Visual Studio,他說道:「用 Windows 做開發的人一定要裝 Visual Studio 這樣專業的 IDE,不要裝其他次等的文字編輯器,才可以有效提升專業度。」
Thumbnail
在上一篇文章中,我們已經準備好製作LINE機器人的工具了,接下來我們就要來做一個最簡單的Python與LINE的串接練習,讓我們的機器人活起來,並且做出最基本的回話功能,如果還沒準備好串接所需的工具,記得先去看《【python】Python+LINE Bot 輕鬆打造股市機器人(二) : 所需準備的
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
Python 提供了一個功能豐富的標準函式庫,其中 random 專門用於生成隨機數。本文將介紹 random 的基本介紹,以及函式應用。
Thumbnail
Dictionary(字典) : 是一個可以用來存放不同資料(不同型態)的容器(集合) 每一個元素都是以{鍵(Key):值(Value)}所構成,字典中每個項目都是用","隔開
Thumbnail
在如今的資訊時代,如何有效的獲取並處理數據,成為了許多專業人士和企業的重要需求,爬蟲技術,作為獲取網絡數據的重要工具,其重要性不言而喻,而這篇文章將分享Python爬蟲的基礎,讓你能獲取想要的網頁數據。
Thumbnail
Python 基本語法 python 語法的後綴名是以.py 結尾 python 執行方式 使用交互介面執行 使用 python test.py 命令執行 使用./test.py 執行 python 標示符 以單下劃線開頭的屬性,表示是類的私有屬性(包括方法,變量)。如:_foo表示不能直接訪問的類
詳細原碼: https://reurl.cc/ex8lZm hello world Variable (變數) 輸入 input() 四則運算 列表 list (陣列) 集合 字典(Dictionary) 給值 try 檢驗 取所有值 判斷式 If else 迴圈 Switch //字典方式 CSV
Thumbnail
每個人都有自己檢視個股好壞的方式,但總是希望每次在查詢時,如果能一鍵就檢視完成那該有多好。今天我們就來學習如何製作一份地雷股檢視圖,學會後就能夠如法炮製,製作自己的一鍵檢視清單,不用再上網依靠其他網站手動檢查,可以省下一大段時間,又能及時了解要投資的個股好壞,以便能適時做出買賣決策
Thumbnail
在先前的教學中,我都教大家程式寫完以後就架設到「Heroku」的雲端上做使用,但如果你想嘗試其他自創的功能,這時一定會需要一直Debug,如果每次想看結果都要部屬一次Heroku,那這樣就變得相當麻煩,所以今天我就教大家如何利用本機端來提供外網連接的方式吧!!
Thumbnail
「VSCode 是世上最棒的 IDE 了吧」這時有人跳出來表示不服,定睛一看原來是那陳年的大哥 Visual Studio,他說道:「用 Windows 做開發的人一定要裝 Visual Studio 這樣專業的 IDE,不要裝其他次等的文字編輯器,才可以有效提升專業度。」
Thumbnail
在上一篇文章中,我們已經準備好製作LINE機器人的工具了,接下來我們就要來做一個最簡單的Python與LINE的串接練習,讓我們的機器人活起來,並且做出最基本的回話功能,如果還沒準備好串接所需的工具,記得先去看《【python】Python+LINE Bot 輕鬆打造股市機器人(二) : 所需準備的