python類裏面的實例方法我是很常用的,這個類方法和靜態方法不怎麼常用。所以有必要記錄一下:
靜態方法,使用@staticmethod修飾;
類方法,使用@classmethod修飾。
實例方法
定義:第一個參數必須是實例對象,參數名約定爲“self”(當然,這個是可以改變的,但還是要self好點),通過它來傳遞實例的屬性和方法(也可以傳類的屬性和方法);
調用:在類外部,原則上由實例對象調用。
類方法
定義:使用裝飾器@classmethod。第一個參數必須是當前類對象,參數名約定爲“cls”,通過它來傳遞類的屬性和方法,原則上不傳實例的屬性和方法【但想傳也是可以的】;
調用:實例對象和類對象都可以調用。
靜態方法
定義:使用裝飾器@staticmethod。參數隨意,沒有“self”和“cls”參數,原則上靜態方法體中不使用類或實例的任何屬性和方法,但本質上是可以調用的;
調用:實例對象和類對象都可以調用。
至於以上爲什麼要加個原則上,因爲python不是java,沒有java那麼安全的類對象管理機制,也可以說成python的類對象機制比較的開放吧。下面這個例子是一個很好的詮釋:
當然,最好遵守上面的那些原則上的原則。
class Foo:
classname = "Foo"
def __init__(self,name):
self.name = name
def f1(self):
print(self.name)
@staticmethod
def f2():
print("static and",Foo.classname)
@classmethod
def f3(cls):
cls.f1(f)
print(cls.classname)
if __name__ == '__main__':
f = Foo("李")
f.f1()
f.f2()
f.f3()
print("----------")
Foo.f1(f)
Foo.f2()
Foo.f3()