python靜態(tài)方法和類方法的區(qū)別實例解析
類方法 (Class Method)
1、定義:使用裝飾器 @classmethod 修飾。第一個參數(shù)必須是 cls,它指向類本身(不是實例),而不是 self。
2、可以通過類名直接調用,也可以通過實例調用(但更推薦用類名調用,以明確意圖)。無論通過哪種方式調用,cls 參數(shù)都會自動傳入為類本身。
3、權限:不能訪問或修改特定的實例屬性(因為它沒有 self),但可以訪問和修改類的屬性(通過 cls.attr)。
4、用途:
工廠方法 (Factory Method):作為一種替代構造函數(shù)的創(chuàng)建實例的方式,可以提供更清晰的語義(例如,根據(jù)不同的參數(shù)格式創(chuàng)建對象)。
操作類級狀態(tài):當方法需要修改或讀取所有實例共享的類變量時。
在繼承中,cls 會指向調用它的子類,這使得類方法在繼承體系中非常有用。
工廠方法代碼:
class Pizza:
def __init__(self, ingredients):
self.ingredients = ingredients
def __repr__(self):
return f'Pizza({self.ingredients})'
@classmethod
def margherita(cls):
# `cls` 在這里是 Pizza 類,我們可以調用它來創(chuàng)建實例
return cls(['mozzarella', 'tomatoes'])
@classmethod
def prosciutto(cls):
return cls(['mozzarella', 'tomatoes', 'ham'])
# 不需要記住配料,直接使用類提供的工廠方法創(chuàng)建特定口味的披薩
pizza1 = Pizza.margherita() # 通過類調用
pizza2 = Pizza.prosciutto()
print(pizza1) # Pizza(['mozzarella', 'tomatoes'])
print(pizza2) # Pizza(['mozzarella', 'tomatoes', 'ham'])
# 也可以通過實例調用(不推薦,容易讓人困惑)
obj = Pizza(['cheese'])
pizza3 = obj.margherita()
print(pizza3) # 同樣創(chuàng)建了一個新的 Pizza 對象靜態(tài)方法 (Static Method)
1、定義:使用裝飾器 @staticmethod 修飾。它沒有強制性的第一個參數(shù)(既沒有 self,也沒有 cls)。
2、調用:可以通過類名直接調用,也可以通過實例調用。
3、權限:不能訪問 self 或 cls。因此,它既不能修改實例狀態(tài),也不能修改類狀態(tài)。它就像一個定義在類命名空間里的普通函數(shù)。
4、用途:
工具函數(shù):當一個函數(shù)在邏輯上屬于某個類,但又不需要訪問類或實例的任何數(shù)據(jù)時。將它放在類內(nèi)部,而不是作為模塊級的函數(shù),可以更好地組織代碼,表明它與該類在功能上是相關的。
命名空間管理:將相關的功能分組到類下面。
工具函數(shù)的代碼:
class Calculator:
@staticmethod
def add(x, y):
return x + y
@staticmethod
def multiply(x, y):
return x * y
# 不需要創(chuàng)建 Calculator 實例,直接通過類名調用
result1 = Calculator.add(5, 3)
result2 = Calculator.multiply(2, 4)
print(result1) # 8
print(result2) # 8
# 也可以通過實例調用(同樣不推薦)
calc_obj = Calculator()
result3 = calc_obj.add(1, 2)
print(result3) # 3實例方法、類方法和靜態(tài)方法的區(qū)別
| 特性 | 實例方法 | 類方法 (@classmethod) | 靜態(tài)方法 (@staticmethod) |
|---|---|---|---|
| 裝飾器 | 無 | @classmethod | @staticmethod |
| 第一個參數(shù) | self (實例對象) | cls (類對象) | 無強制參數(shù) |
| 訪問實例屬性 | 是 (通過 self) | 否 | 否 |
| 訪問類屬性 | 是 (通過 self.class 或類名) | 是 (通過 cls) | 否 |
| 修改實例狀態(tài) | 是 | 否 | 否 |
| 修改類狀態(tài) | 是 | 是 | 否 |
| 主要用途 | 操作或讀取實例數(shù)據(jù) | 作為工廠方法、操作類級狀態(tài) | 工具函數(shù)、命名空間組織 |
| 調用方式 | 必須通過實例 | 推薦通過類,也可通過實例 | 推薦通過類,也可通過實例 |
如何選擇方法?
1、需要訪問或修改實例數(shù)據(jù)嗎?
是 -> 使用 實例方法。
2、不需要訪問實例數(shù)據(jù),但需要訪問或修改類數(shù)據(jù)(類屬性),或者需要作為工廠創(chuàng)建實例嗎?
是 -> 使用 類方法。
3、既不需要訪問實例數(shù)據(jù),也不需要訪問類數(shù)據(jù)嗎?
是 -> 使用 靜態(tài)方法。
到此這篇關于python---靜態(tài)方法和類方法的文章就介紹到這了,更多相關python靜態(tài)方法和類方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
使用python將微信image下.dat文件解密為.png的方法
這篇文章主要介紹了使用python將微信image下.dat文件解密為.png的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11
Python中使用實現(xiàn)輸出哈沙德數(shù)的多種方法小結
哈沙德數(shù)(Harshad?Number),又稱Niven數(shù),是指一個自然數(shù),它可以被它的各位數(shù)字之和整除,本文將探討如何使用多種不同的方法來判斷一個數(shù)字是否是哈沙德數(shù),感興趣的可以了解下2024-01-01
2020最新pycharm漢化安裝(python工程獅親測有效)
這篇文章主要介紹了2020最新pycharm漢化安裝(python工程獅親測有效),文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-04-04
Python OpenCV圖像指定區(qū)域裁剪的實現(xiàn)
這篇文章主要介紹了Python OpenCV圖像指定區(qū)域裁剪的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-10-10
Django實現(xiàn)從數(shù)據(jù)庫中獲取到的數(shù)據(jù)轉換為dict
這篇文章主要介紹了Django實現(xiàn)從數(shù)據(jù)庫中獲取到的數(shù)據(jù)轉換為dict,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03

