python classmethod()是Python標準庫中的一個內置方法。在Python中,有三種類型的方法,分別是:實例方法、類方法和靜態方法。
這篇文章首先介紹一下類方法的含義及使用方法。
在Python中,類方法是可以使用類名直接調用的方法,類方法可以在類的所有對象中進行共享。classmethod()方法可以把類中的一個方法轉化為類方法,但要求類中定義的那個方法的第一個參數是 cls ,當然這只是約定俗成的,使用其他標識符也可以,主要用于隱式的表示類自身,以調用類的屬性、方法,以及實例化對象等,這點與實例方法中的 self 參數相似。
類方法即可以使用類來調用(如C.f()),又可以使用類的實例來調用(如C().f())。如果類方法由派生類來調用,則派生類的對象將作為classmethod()的第一個參數。
Python中的類方法與Java、C#等中的靜態方法不同,這些問題將在今后的文章中進行探討。
該方法的語法格式如下:
classmethod(function)
function:用于指定類中轉換為類方法的方法名稱,當然也應該包含類名。
該函數沒有返回值。
下面使用實例來說明classmethod()方法的具體使用過程。
class Hello:
word = "你好"
def SayHello(cls):
print(cls.word)
#定義一個實例
h = Hello()
#實例調用SayHello
h.SayHello()
#Hello.SayHello() #這時使用會報錯
#將SayHello指定為類方法
Hello.SayHello= classmethod(Hello.SayHello)
#用實例來調用
h.SayHello() #你好
#用類方法
Hello.SayHello() #你好
#用實例修改word的值
h.word="關注:優雅的代碼"
h.SayHello() #你好
Hello.SayHello() #你好
#用類名修改word的值
Hello.word="優雅的代碼"
h.SayHello() #優雅的代碼
Hello.SayHello() #優雅的代碼
輸出結果如下:(上面代碼為了讓大家看得清楚,使用注釋方法也注釋了輸出內容。)
你好
你好
你好
你好
你好
優雅的代碼
優雅的代碼
從上面的代碼及輸出結果可以看出:
(1)類方法中可以訪問類的變量和方法;
(2)類方法可以使用類名調用,也可以使用類的實例調用;
(3)把一個方法轉換成類方法后,使用實例調用時只能讀取類共享的變量值,無法獲取實例的變量值;
(4)類方法不能獲取實例的變量值,只能讀取類共享的變量值,即類變量的默認值或使用類名調用變量修改的值。
下面再看一個例子:
class Hello:
word = "你好"
def SayHello(self):
print(self.word)
def Say(cls, w):
cls.word = w
cls.SayHello()
Hello.SayHello = classmethod(Hello.SayHello)
Hello.Say = classmethod(Hello.Say)
Hello.SayHello()
Hello.Say("歡迎關注微信訂閱號:優雅的代碼")
輸出結果如下所示:
你好
歡迎關注微信訂閱號:優雅的代碼
這段代碼主要演示類方法帶有其它參數的情況。
classmethod()方法是在Python 2.2版本加進來的,但很明顯這種定義類方法的過程還是很麻煩,在Python2.4版本中使用方法修飾符的方法來實現,即在類中需要定義類方法上面使用@classmethod修飾符來指定該方法為類方法。其基本語法格式如下:
class className:
@classmethod
def funname(cls, arg1,arg2,...):
#方法的相關代碼
上面的@classmethod是funname()方法的修飾符,它指示funname()是一個類方法。下面看一個具體的例子:
class Student:
age = 23
@classmethod
def printAge(cls):
print(cls.age)
Student.printAge()
輸出結果:
23
使用@classmethod修飾符指定的類方法與上面所講的要求相同。
以上講解了關于Python中classmethod()方法和@classmethod修飾符的作用,如有問題,歡迎留言。
|
新聞熱點
疑難解答