class test: class_name = "test" def __init__(self, name): self.class_name = name def my_print(self, value): print(value + " " +self.class_name) @staticmethod def my_static_print(val): print(val) @classmethod def my_class_print(cls, val): print(val +" "+ cls.class_name) if __name__ == "__main__": my_test = test("xxx") test.my_static_print("static print") test.my_class_print("class print") my_test.my_static_print("static print") my_test.my_class_print("class print") my_test.my_print("my_print")
執行結果以下:spa
static print class print test static print class print test my_print xxx
我的理解:code
@staticmethod 不須要訪問和類相關的屬性或數據(感受只是概念上的區別,你這樣聲明瞭用的人就知道了,若是你非要在這個方法中訪問test.xxx 它就和@classmethod的做用同樣了。)blog
@classmethod 能夠訪問和類相關(不和實例相關)的屬性,看 test.my_class_print("class print") 和 my_test.my_class_print("class print") 的結果都是class中定義的class_name 的值,非實例的值:xxxit
若是你定義了一個方法它的返回值永遠和類的屬性及實例無關,結果永遠不變,就用@staticmethodclass
若是你定義了一個方法它的返回值和只和類的屬性有關,結果可變(好比上例,我用test.class_name="AAA"改變類的屬性值,my_class_print輸出的結果就改變了) .就用@classmethod test