靜態方法實際上就是普通函數,定義形式是在def行前加修飾符@staticmethod,只是由於某種原因需要定義在類里面。靜態方法的參數可以根據需要定義,不需要特殊的self參數。可以通過類名或者值為實例對象的變量,已屬性引用的方式調用靜態方法
類方法定義形式是在def行前加修飾符@classmethod,這種方法必須有一個表示其調用類的參數,一般用cls作為參數名,還可以有任意多個其他參數。類方法也是類對象的屬性,可以以屬性訪問的形式調用。在類方法執行時,調用它的類將自動約束到方法的cls參數,可以通過這個參數訪問該類的其他屬性。通常用類方法實現與本類的所有對象有關的操作。
1 ##coding:utf-8 2 class TestClassMethod(object): 3 4 METHOD = 'method hoho' 5 6 def __init__(self): 7 self.name = 'leon' 8 9 def test1(self): 10 print 'test1' 11 print self 12 13 @classmethod 14 def test2(cls): 15 print cls 16 print 'test2' 17 print TestClassMethod.METHOD 18 print '----------------' 19 20 @staticmethod 21 def test3(): 22 print TestClassMethod.METHOD 23 print 'test3' 24 25 26 a = TestClassMethod() 27 a.test1() 28 a.test2() 29 a.test3() 30 TestClassMethod.test3()
test1 <__main__.TestClassMethod object at 0x0000000003DDA5F8> <class '__main__.TestClassMethod'> test2 method hoho ---------------- method hoho test3 method hoho test3
實例方法隱含的參數為類實例,而類方法隱含的參數為類本身。
靜態方法無隱含參數,主要為了類實例也可以直接調用靜態方法。
所以邏輯上類方法應當只被類調用,實例方法實例調用,靜態方法兩者都能調用。
在貼一例,供參考:
1 class TestClassMethod(object): 2 3 METHOD = 'method hoho' 4 5 def __init__(self): 6 self.name = 'leon' 7 8 def test1(self): 9 print 'test1' 10 print self 11 12 @classmethod 13 def test2(cls): 14 print cls 15 print 'test2' 16 print TestClassMethod.METHOD 17 print '----------------' 18 19 @staticmethod 20 def test3(): 21 print TestClassMethod.METHOD 22 print 'test3' 23 24 25 a = TestClassMethod() 26 a.test1() 27 a.test2() 28 a.test3() 29 TestClassMethod.test3()
test1 <__main__.TestClassMethod object at 0x0000000003DDA5F8> <class '__main__.TestClassMethod'> test2 method hoho ---------------- method hoho test3 method hoho test3