python靜態(tài)方法和類方法的區(qū)別實(shí)例解析
類方法 (Class Method)
1、定義:使用裝飾器 @classmethod 修飾。第一個(gè)參數(shù)必須是 cls,它指向類本身(不是實(shí)例),而不是 self。
2、可以通過(guò)類名直接調(diào)用,也可以通過(guò)實(shí)例調(diào)用(但更推薦用類名調(diào)用,以明確意圖)。無(wú)論通過(guò)哪種方式調(diào)用,cls 參數(shù)都會(huì)自動(dòng)傳入為類本身。
3、權(quán)限:不能訪問(wèn)或修改特定的實(shí)例屬性(因?yàn)樗鼪](méi)有 self),但可以訪問(wèn)和修改類的屬性(通過(guò) cls.attr)。
4、用途:
工廠方法 (Factory Method):作為一種替代構(gòu)造函數(shù)的創(chuàng)建實(shí)例的方式,可以提供更清晰的語(yǔ)義(例如,根據(jù)不同的參數(shù)格式創(chuàng)建對(duì)象)。
操作類級(jí)狀態(tài):當(dāng)方法需要修改或讀取所有實(shí)例共享的類變量時(shí)。
在繼承中,cls 會(huì)指向調(diào)用它的子類,這使得類方法在繼承體系中非常有用。
工廠方法代碼:
class Pizza:
def __init__(self, ingredients):
self.ingredients = ingredients
def __repr__(self):
return f'Pizza({self.ingredients})'
@classmethod
def margherita(cls):
# `cls` 在這里是 Pizza 類,我們可以調(diào)用它來(lái)創(chuàng)建實(shí)例
return cls(['mozzarella', 'tomatoes'])
@classmethod
def prosciutto(cls):
return cls(['mozzarella', 'tomatoes', 'ham'])
# 不需要記住配料,直接使用類提供的工廠方法創(chuàng)建特定口味的披薩
pizza1 = Pizza.margherita() # 通過(guò)類調(diào)用
pizza2 = Pizza.prosciutto()
print(pizza1) # Pizza(['mozzarella', 'tomatoes'])
print(pizza2) # Pizza(['mozzarella', 'tomatoes', 'ham'])
# 也可以通過(guò)實(shí)例調(diào)用(不推薦,容易讓人困惑)
obj = Pizza(['cheese'])
pizza3 = obj.margherita()
print(pizza3) # 同樣創(chuàng)建了一個(gè)新的 Pizza 對(duì)象靜態(tài)方法 (Static Method)
1、定義:使用裝飾器 @staticmethod 修飾。它沒(méi)有強(qiáng)制性的第一個(gè)參數(shù)(既沒(méi)有 self,也沒(méi)有 cls)。
2、調(diào)用:可以通過(guò)類名直接調(diào)用,也可以通過(guò)實(shí)例調(diào)用。
3、權(quán)限:不能訪問(wèn) self 或 cls。因此,它既不能修改實(shí)例狀態(tài),也不能修改類狀態(tài)。它就像一個(gè)定義在類命名空間里的普通函數(shù)。
4、用途:
工具函數(shù):當(dāng)一個(gè)函數(shù)在邏輯上屬于某個(gè)類,但又不需要訪問(wèn)類或?qū)嵗娜魏螖?shù)據(jù)時(shí)。將它放在類內(nèi)部,而不是作為模塊級(jí)的函數(shù),可以更好地組織代碼,表明它與該類在功能上是相關(guān)的。
命名空間管理:將相關(guān)的功能分組到類下面。
工具函數(shù)的代碼:
class Calculator:
@staticmethod
def add(x, y):
return x + y
@staticmethod
def multiply(x, y):
return x * y
# 不需要?jiǎng)?chuàng)建 Calculator 實(shí)例,直接通過(guò)類名調(diào)用
result1 = Calculator.add(5, 3)
result2 = Calculator.multiply(2, 4)
print(result1) # 8
print(result2) # 8
# 也可以通過(guò)實(shí)例調(diào)用(同樣不推薦)
calc_obj = Calculator()
result3 = calc_obj.add(1, 2)
print(result3) # 3實(shí)例方法、類方法和靜態(tài)方法的區(qū)別
| 特性 | 實(shí)例方法 | 類方法 (@classmethod) | 靜態(tài)方法 (@staticmethod) |
|---|---|---|---|
| 裝飾器 | 無(wú) | @classmethod | @staticmethod |
| 第一個(gè)參數(shù) | self (實(shí)例對(duì)象) | cls (類對(duì)象) | 無(wú)強(qiáng)制參數(shù) |
| 訪問(wèn)實(shí)例屬性 | 是 (通過(guò) self) | 否 | 否 |
| 訪問(wèn)類屬性 | 是 (通過(guò) self.class 或類名) | 是 (通過(guò) cls) | 否 |
| 修改實(shí)例狀態(tài) | 是 | 否 | 否 |
| 修改類狀態(tài) | 是 | 是 | 否 |
| 主要用途 | 操作或讀取實(shí)例數(shù)據(jù) | 作為工廠方法、操作類級(jí)狀態(tài) | 工具函數(shù)、命名空間組織 |
| 調(diào)用方式 | 必須通過(guò)實(shí)例 | 推薦通過(guò)類,也可通過(guò)實(shí)例 | 推薦通過(guò)類,也可通過(guò)實(shí)例 |
如何選擇方法?
1、需要訪問(wèn)或修改實(shí)例數(shù)據(jù)嗎?
是 -> 使用 實(shí)例方法。
2、不需要訪問(wèn)實(shí)例數(shù)據(jù),但需要訪問(wèn)或修改類數(shù)據(jù)(類屬性),或者需要作為工廠創(chuàng)建實(shí)例嗎?
是 -> 使用 類方法。
3、既不需要訪問(wèn)實(shí)例數(shù)據(jù),也不需要訪問(wèn)類數(shù)據(jù)嗎?
是 -> 使用 靜態(tài)方法。
到此這篇關(guān)于python---靜態(tài)方法和類方法的文章就介紹到這了,更多相關(guān)python靜態(tài)方法和類方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python入門之實(shí)例方法、類方法和靜態(tài)方法的區(qū)別講解
- Python中類方法@classmethod和靜態(tài)方法@staticmethod解析
- Python?類方法和靜態(tài)方法之間的區(qū)別
- python類方法和靜態(tài)方法詳解
- 淺談python 類方法/靜態(tài)方法
- Python實(shí)例方法、類方法、靜態(tài)方法區(qū)別詳解
- 深入了解Python 方法之類方法 & 靜態(tài)方法
- Python 面向?qū)ο箪o態(tài)方法、類方法、屬性方法知識(shí)點(diǎn)小結(jié)
- Python 靜態(tài)方法和類方法實(shí)例分析
相關(guān)文章
使用python將微信image下.dat文件解密為.png的方法
這篇文章主要介紹了使用python將微信image下.dat文件解密為.png的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11
Python中使用實(shí)現(xiàn)輸出哈沙德數(shù)的多種方法小結(jié)
哈沙德數(shù)(Harshad?Number),又稱Niven數(shù),是指一個(gè)自然數(shù),它可以被它的各位數(shù)字之和整除,本文將探討如何使用多種不同的方法來(lái)判斷一個(gè)數(shù)字是否是哈沙德數(shù),感興趣的可以了解下2024-01-01
Python驗(yàn)證碼識(shí)別處理實(shí)例
這篇文章主要介紹了Python驗(yàn)證碼識(shí)別處理實(shí)例,實(shí)現(xiàn)過(guò)程講解很詳細(xì),感興趣的小伙伴們可以參考一下2015-12-12
基于Python的Jenkins的二次開(kāi)發(fā)操作
這篇文章主要介紹了基于Python的Jenkins的二次開(kāi)發(fā)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05
2020最新pycharm漢化安裝(python工程獅親測(cè)有效)
這篇文章主要介紹了2020最新pycharm漢化安裝(python工程獅親測(cè)有效),文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
Python3.4 tkinter,PIL圖片轉(zhuǎn)換
我們給大家整理了關(guān)于Python3.4 tkinter,PIL圖片轉(zhuǎn)換的相關(guān)完整代碼,大家可以學(xué)習(xí)測(cè)試下。2018-06-06
Python OpenCV圖像指定區(qū)域裁剪的實(shí)現(xiàn)
這篇文章主要介紹了Python OpenCV圖像指定區(qū)域裁剪的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
Django實(shí)現(xiàn)從數(shù)據(jù)庫(kù)中獲取到的數(shù)據(jù)轉(zhuǎn)換為dict
這篇文章主要介紹了Django實(shí)現(xiàn)從數(shù)據(jù)庫(kù)中獲取到的數(shù)據(jù)轉(zhuǎn)換為dict,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03
Python 類與元類的深度挖掘 II【經(jīng)驗(yàn)】
元類在 Python 中屬于比較深層的黑魔法,在一般的日常應(yīng)用中可能并不常用,但理解其背后的原理對(duì)于理解 Python 面向?qū)ο缶幊桃约耙磺薪詾閷?duì)象的理念很有幫助;如果你需要對(duì)類進(jìn)行深度改造,至少要知道從何入手。2016-05-05

