Python標準庫:內建函數classmethod(function),pythonclassmethod
把類函數當作類的一個方法返回。類方法第一個參數是指明類,跟類中函數一樣,第一個參數是指明類執行個體。類方法修飾符採用下面的格式來使用:
class C:
@classmethod
def f(cls, arg1, arg2, ...):
...
從上面格式來看,@classmethod是函數在前置的一個修飾符,可以查看語言參考手冊。經過類方法修飾符的函數,可以直接通過類來調用,比如C.f()方式;也可以通執行個體的方式來調用,比如C().f()方式,但這個執行個體在這個函數裡被忽略掉了,沒起到什麼作用。如果類方法修飾符的函數,在繼承類時,衍生類別作為第一個參數傳遞給這個函數,也就是cls等於衍生類別。
類方法修飾符定義的函數與C++或JAVA裡靜態函數是不一樣的,如果要相似的功能,需要使用另外一個修飾符staticmethod。
classmethod設計的目的是什麼呢?其實與Python物件導向編程有關的,因為Python不支援多個的參數重載建構函式,比如在C++裡,建構函式可以根據參數個數不一樣,可以寫多個建構函式。Python為瞭解決這個問題,採用classmethod修飾符的方式,這樣定義出來的函數就可以在類對象執行個體化之前調用這些函數,就相當於多個建構函式,解決多個建構函式的代碼寫在類外面的問題。
與修飾符staticmethod的區別是類方法有一個型別參數,而靜態方法沒有。靜態方法主要用來解決全域函數的範圍的問題,而類方法是解決多個建構函式的問題,因此應用場境不一樣。
例子:
#classmethod()class C: def __init__(self, i): print('__init__: %d' % i) @classmethod def f(cls, name): print(name) return C(int(name)) a = C(1)b = C.f('10')c = C(2).f('100') class D(C): pass D.f('20')
輸出結果如下:
__init__: 1
10
__init__: 10
__init__: 2
100
__init__: 100
20
__init__: 20