靜態方法是指類中無需例項參與即可呼叫的方法(不需要self引數),在呼叫過程中,無需將類例項化,直接在類之後使用.號運算子呼叫方法。
通常情況下,靜態方法使用@staticmethod裝飾器來宣告。
這裡需要注意的是,在python 2 中,如果乙個類的方法不需要self引數,必須宣告為靜態方法,即加上@staticmethod裝飾器,從而不帶例項呼叫它。class classa(object):
@staticmethod
def func_a():
print('hello python')
if __name__ == '__main__':
classa.func_a()
# 也可以使用例項呼叫,但是不會將例項作為引數傳入靜態方法
ca = classa()
ca.func_a()
而在python 3中,如果乙個類的方法不需要self引數,不再需要宣告為靜態方法,但是這樣的話只能通過類去呼叫這個方法,如果使用例項呼叫這個方法會引發異常
異常資訊:class classa(object):
def func_a():
print('hello python')
if __name__ == '__main__':
classa.func_a()
# 以下使用例項呼叫會引發異常
ca = classa()
ca.func_a()
func_a() takes 0 positional arguments but 1 was given
類方法在python中使用比較少,類方法傳入的第乙個引數為cls,是類本身。並且,類方法可以通過類直接呼叫,或通過例項直接呼叫。但無論哪種呼叫方式,最左側傳入的引數一定是類本身。
通常情況下,類方法使用@classmethod裝飾器來宣告
從執行結果可以看出,無論是類呼叫還是例項呼叫,類方法都能正常工作。且通過列印cls,可以看出cls傳入的都是類例項本身。class classa(object):
@classmethod
def func_a(cls):
print(type(cls), cls)
if __name__ == '__main__':
classa.func_a()
ca = classa()
ca.func_a()
這裡需要注意,如果存在類的繼承,那類方法獲取的類是類樹上最底層的類。
**中classa繼承自basea、baseb,在呼叫類方法時,雖然類方法是從basea繼承而來,但是傳入func_a的cls函式實際上是classa,也就是最底層(最具體)的類。class basea(object):
@classmethod
def func_a(cls):
print(type(cls), cls)
class baseb(object):
pass
class classa(basea, baseb):
pass
if __name__ == '__main__':
classa.func_a()
ca = classa()
ca.func_a()
執行結果:
所以,在某些時候,需要明確呼叫類屬性時,不要使用類方法傳入的cls引數,因為它傳入的是類樹中最底層的類,不一定符合設計初衷。
可以直接通過類名訪問類屬性。
例項方法,除靜態方法與類方法外,類的其他方法都屬於例項方法。class basea(object):
@classmethod
def func_a(cls):
# 直接使用類名,而不使用cls
print(basea)
print(type(cls), cls)
class baseb(object):
pass
class classa(basea, baseb):
pass
if __name__ == '__main__':
classa.func_a()
例項方法需要將類例項化後呼叫,如果使用類直接呼叫例項方法,需要顯式地將例項作為引數傳入。
最左側傳入的引數self,是例項本身。
class classa(object):
def func_a(self):
print('hello python')
if __name__ == '__main__':
# 使用例項呼叫例項方法
ca = classa()
ca.func_a()
# 如果使用類直接呼叫例項方法,需要顯式地將例項作為引數傳入
classa.func_a(ca)
python例項方法 靜態方法 類方法
class foo object deftest self 定義了例項方法 print object classmethod deftest2 clss 定義了類方法 print class staticmethod deftest3 定義了靜態方法 print static 1 例項方法就是類的例...
Python例項方法,類方法,靜態方法
class foo object def test self 定義了例項方法 print object classmethod def test2 cls 定義了類方法 print class staticmethod def test3 定義了靜態方法 print static 1 例項方法就是類...
python例項方法 類方法和靜態方法
class testclassmethod object method method hoho def init self self.name leon def test1 self print test1 print self classmethod def test2 cls print cls...