唉~今天為了python中靜態方法和類方法差了一下午啊,最後在官方文檔中糾結了半天,最後終於知道了這兩種函數有什麼區別。唉~怎麼這麼糾結啊~果然對一門語言深入學習是很蛋疼的事情啊,還好暫時不打算深入學習python。
在一個類方法中,如果使用self(其實可以使用其他名字代替,例如this,使用self只是一種約定,目的是為了統一代碼風格,增強可讀性)作為第一個參數,那麼這個函數將視為這個類中的執行個體方法,通過類不能直接存取。如果我們將第一個參數設為cls(同self一樣,也是一種約定),那麼這個函數在類中將被視為類函數,同時,這個函數需要使用classmethod函數來將其轉換成真正的類方法(現在一般都是用decorator)。如果我們並不將類或者執行個體作為第一個參數,那麼這個函數將被視為靜態函數,同時,與類方法類似,我們需要使用staticmethod函數將這個函數轉換成真正的靜態方法。
所以,我們可以看出,在定義靜態方法的時候,我們並沒有像類方法或者執行個體方法一樣,將類或者執行個體作為第一個參數傳遞個方法,而區別也就在這裡了。因為在類方法中的第一個參數是類,因此,我們可以在函數中使用這個引用。也就是說,當我們需要使用類的引用的時候我們需要使用類方法。不需要使用類的引用的時候則可以使用靜態方法。就如同官方文檔中《Descriptor HowTo Guide》中的“Static Methods and Class Methods”中所講的:
對靜態方法:“there may be useful functions which are conceptually related but do not depend on the data.”
對類方法:“This behavior is useful whenever the function only needs to have a class reference and does not care about any underlying data.”
當然,這並不是絕對的,我們同樣可以使用靜態方法完成類方法所要完成的,畢竟,我們可以在靜態方法中定義一個變數作為類的引用。所以我覺得類方法只是一個使用類引用的靜態方法,是一種類似文法糖的存在。也許有人會說,並沒有什麼說靜態方法與類綁定了,而卻到處都有說類方法與類綁定了。不過我認為,因為不論是靜態方法還是類方法其實都是生存在統一命名空間之中的,也就是說它們都是與所在類有一種綁定的關係。只不過由於類方法的第一個參數是類,所以類方法對類存在著另一種綁定的關係。
初學python,個人觀點,不喜勿噴,錯誤請指正,共同學習探討。