一、先看語法,python 類語法中有三種方法,實例方法,靜態方法,類方法。
普通實例方法,第一個參數需要是self,它表示一個具體的實例本身。
如果用了staticmethod,那么就可以無視這個self,而將這個方法當成一個普通的函數使用。
而對于classmethod,它的第一個參數不是self,是cls,它表示這個類本身。
說明:
實例方法只能被實例對象調用,靜態方法(由@staticmethod裝飾的方法)、類方法(由@classmethod裝飾的方法),可以被類或類的實例對象調用。
實例方法,第一個參數必須要默認傳實例對象,一般習慣用self。
靜態方法,參數沒有要求。
類方法,第一個參數必須要默認傳類,一般習慣用cls。
?
二、靜態方法、類方法使用區別或者說使用場景
?
1、類方法用在模擬java定義多個構造函數的情況。
?由于python類中只能有一個初始化方法,不能按照不同的情況初始化類。
2、類中靜態方法來調用靜態方法和類方法來調用靜態方法例子。
靜態方法調用另一個靜態方法,如果改用類方法調用靜態方法,可以讓cls代替類,
讓代碼看起來精簡一些。也防止類名修改了,不用在類定義中修改原來的類名。
3、繼承類中的區別?
從下面代碼可以看出,如果子類繼承父類的方法,子類覆蓋了父類的靜態方法,
子類的實例繼承了父類的static_method靜態方法,調用該方法,還是調用的父類的方法和類屬性。
子類的實例繼承了父類的class_method類方法,調用該方法,調用的是子類的方法和子類的類屬性。
# coding:utf-8 class Foo(object):X = 1Y = 14@staticmethoddef averag(*mixes): # "父類中的靜態方法"return sum(mixes) / len(mixes)@staticmethoddef static_method(): # "父類中的靜態方法"print("父類中的靜態方法")return Foo.averag(Foo.X, Foo.Y)@classmethoddef class_method(cls): # 父類中的類方法print("父類中的類方法")return cls.averag(cls.X, cls.Y)class Son(Foo):X = 3Y = 5@staticmethoddef averag(*mixes): # "子類中重載了父類的靜態方法"print("子類中重載了父類的靜態方法")return sum(mixes) / 3p = Son() print("result of p.averag(1,5)") print(p.averag(1, 5)) print("result of p.static_method()") print(p.static_method()) print("result of p.class_method()") print(p.class_method())
輸出為:
result of p.averag(1,5)
子類中重載了父類的靜態方法
2.0
result of p.static_method()
父類中的靜態方法
7.5
result of p.class_method()
父類中的類方法
子類中重載了父類的靜態方法
2.6666666666666665
參考:
1、https://blog.csdn.net/helloxiaozhe/article/details/79940321