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應用原理及管...