Python的classmethod和staticmethod關鍵字有什麼作用呢?

時間 2021-06-01 10:08:50

1樓:BigYoung

第一:這兩個不叫關鍵字,應該是新手,可以理解

第二:在類方法前加不加classmethod和staticmethod,並不影響方法的實現

第三:具體的區別,可以查他們兩個的具體用法。簡單點說:

classmethod 必須有乙個指向類物件的引用作為第乙個引數,而 staticmethod 可以沒有任何引數,可以直接呼叫。

2樓:

乙個乙個答。

1、沒加關鍵字,不是也可以實現classmethod和staticmethod的功能?

有一些屬性在含義上屬於「類」,不屬於「例項」,當做例項特性通過例項方法訪問不合適,當做類變數通過不帶self的方法去訪問Python2又不支援。

例如,假如我問你,Kls一共被例項化了多少次,怎麼辦?

1)你也可以用例項方法去操作乙個例項特性self.count,在_init__的時候讓self.count + 1,但統計多少次時你也必須通過乙個例項去訪問這個特性,instance.

count。

如果有100個例項,用哪乙個?還是隨便乙個?其實無論哪乙個含義都有點彆扭,因為count邏輯上是「類「的乙個屬性,不屬於任何乙個例項。

2)你可能還會想到把count定義為類變數,然後通過不帶self的方法去訪問,但Python2不支援。

2、為什麼需要加classmethod關鍵字?

不加是普通例項方法,加上成為類方法,有特權:類變數,既可以通過例項訪問也可以通過不帶self的方法訪問。

class Spam:

numInstances = 0

def __init__(self):

Spam.numInstances += 1

def printNumInstances(cls):

print("Number of instances:", cls.numInstances)

printNumInstances = classmethod(printNumInstances)

if __name__ == "__main__":

a,b = Spam(), Spam()

a.printNumInstances()

Spam.printNumInstances()

print()

class Sub(Spam):

def printNumInstances(cls):

print("Extra stuff...", cls)

Spam.printNumInstances()

printNumInstances = classmethod(printNumInstances)

if __name__ == "__main__":

x, y = Sub(), Spam()

x.printNumInstances()

y.printNumInstances()

Sub.printNumInstances()

print()

class Other(Spam):

pass

if __name__ == "__main__":

z = Other()

z.printNumInstances()

3、classmethod中的第乙個引數是cls,我如果直接用類名代替不可以嗎?

如果是繼承……cls自動是當前的類,不用改來改去……

class Spam:

numInstances = 0

def count(cls):

"""之前子類也是呼叫父類的init,子類沒有自己的numInstances,所以計數一直在父類上"""

cls.numInstances += 1

def __init__(self):

"""會傳入self引數,表示把當前例項傳進count,從而實現對當前類計數"""

self.count()

count = classmethod(count)

class Sub(Spam):

"""有了自己的計數變數"""

numInstances = 0

def __init__(self):

"""雖然呼叫的是父類init方法,但是最終會操作到自己的計數變數"""

Spam.__init__(self)

class Other(Spam):

numInstances = 0

if __name__ == "__main__":

x = Spam()

y1, y2 = Sub(), Sub()

z1, z2, z3 = Other(), Other(), Other()

print(x.numInstances, y1.numInstances, z1.numInstances)

print(Spam.numInstances, Sub.numInstances, Other.numInstances)

3樓:shuhari

從呼叫者的角度講,不加 staticmethod 是完全可以的。不過加了 staticmethod 的方法是乙個 staticmethod 物件,不加的是普通的 function,它們還是有區別的(雖然這種區別可能只對 Python 直譯器有意義)。另外,加上 staticmethod 也讓開發者的意圖更明確,不然很多人看到方法第乙個引數不是 self,通常第一反應會覺得是不是寫錯了。

classmethod 在繼承情況下 cls 可能代表不同的類,可以實現類似多型的功能。另外乙個潛在的好處是,當你重構類名時不用修改那麼多地方(從而減少出錯的機會)。

Python問題,求助Python大神 這個程式為什麼執行失敗了?

黃哥 只修改了你的語法錯誤,原因是有二處少了右括號 黃哥Python培訓黃哥所改 print 想乙個10以內的數 a input 這個數大於5嗎?Yes No if a Yes i input 這個數是5嗎?Yes No if i Yes print 這個數是5 elif i No b input ...

有Python新手嘛,大家覺得Python學習難不難呀?

程式設計小十 無論是學習什麼,要入門學習,肯定是需要經過一番努力的,更何況還是一種程式語言呢。其實,我認為在學習python程式設計的中,可能最重要的就是興趣,這是持續學習的原始動力,而只有持續學習才能真正學會python程式設計。那麼,python學起來會很難嗎?下面就給大家具體講一下。pytho...

Python 系統運維和 Python 開發要學什麼?

知了堂教育 Python系統運維學習路線 1 Linux基礎知識 基本命令 2 Linux使用者及許可權基礎 3 Linux系統程序管理高階 4 Linux高效文字 檔案處理命令 5 shell指令碼入門 可邊練習邊學習 6 shell指令碼高階 7 TCP IP網路基礎 8 MySQL應用原理及管...