python靜態類方法
A. python類方法和靜態方法的區別
類方法,可以調用類屬性。。。用於操作一些類中的公有屬性。。。比如這個士兵類,每個士兵都擁有一把相同的槍(gun),都有相同的最大血量(maxhp),如果在創建對象的時候,一個一個的賦值,就會顯得比較多餘。。。因此,把這兩個屬性提出來,作為一個公有屬性。。即每個士兵對象,都擁有一把95式步槍,都擁有30的最大血量。。之後聲明一個類方法(public),之後可以在類方法中,針對這兩個公有的屬性進行操作。。。
靜態方法,其實更像一個與類幾乎無關的函數。。不能操作類中的任何屬性。。所以它並不是用來操作類與對象本身的。。。但它又可以被對象調用。。。。比如游戲中,與士兵對話,士兵說話的內容一般存在資料庫中。。而當主角與士兵對話,針對資料庫查詢,並輸出到UI界面的相關工作,就可以放在這個函數里。。這樣會讓代碼結構更清晰。。。當然,如果不嫌亂,寫在類方法中,也是可以的。。。有人覺得PYTHON的靜態方法是雞肋。。它也確實不是必須的,但有時候卻可以讓代碼結構更清晰。。。比如你有幾十種不同的士兵類,你要找到對應每一個類的數據操作相關的函數,就會顯得很困難。。。適當使用靜態方法,就顯得一目瞭然
B. python 類方法和靜態方法的區別
類方法的第一個parameter是類自己,然後才是參數。而靜態方法是和類無關的,也不會自動導入類作為參數。可以說靜態方法只是一個和自己所在的類無關的一個方法。可以隨意你怎麼用這個方法。抽象點說靜態方法就是你在其他語言裡面用的普通方法,類方法是Java里的類方法一樣的。
C. Python中靜態方法和類方法的區別
靜態方法是調用時跟具體實例沒有關聯的方法,不需要使用self和cls參數。
類方法是調用的時候,要使用類的相關成員的方法,需要使用cls參數,但不用self參數。
參考:劉江的Python教程
D. python 類方法和靜態方法的區別
面相對象程序設計中,類方法和靜態方法是經常用到的兩個術語。
邏輯上講:類方法是只能由類名調用;靜態方法可以由類名或對象名進行調用。
在C++中,靜態方法與類方法邏輯上是等價的,只有一個概念,不會混淆。
而在python中,方法分為三類實例方法、類方法、靜態方法。代碼如下:
class Test(object):
def InstanceFun(self):
print("InstanceFun");
print(self);
@classmethod
def ClassFun(cls):
print("ClassFun");
print(cls);
@staticmethod
def StaticFun():
print("StaticFun");
t = Test();
t.InstanceFun();# 輸出InstanceFun,列印對象內存地址「<__main__.Test object at 0x0293DCF0>」
Test.ClassFun(); # 輸出ClassFun,列印類位置 <class '__main__.Test'>
Test.StaticFun(); # 輸出StaticFun
t.StaticFun(); # 輸出StaticFun
t.ClassFun(); # 輸出ClassFun,列印類位置 <class '__main__.Test'>
Test.InstanceFun(); # 錯誤,TypeError: unbound method instanceFun() must be called with Test instance as first argument
Test.InstanceFun(t); # 輸出InstanceFun,列印對象內存地址「<__main__.Test object at 0x0293DCF0>」
t.ClassFun(Test); # 錯誤 classFun() takes exactly 1 argument (2 given)
可以看到,在python中,兩種方法的主要區別在於參數。實例方法隱含的參數為類實例self,而類方法隱含的參數為類本身cls。
靜態方法無隱含參數,主要為了類實例也可以直接調用靜態方法。
所以邏輯上類方法應當只被類調用,實例方法實例調用,靜態方法兩者都能調用。主要區別在於參數傳遞上的區別,實例方法悄悄傳遞的是self引用作為參數,而類方法悄悄傳遞的是cls引用作為參數。
python實現了一定的靈活性使得類方法和靜態方法,都能夠被實例和類二者調用