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")
執行結果如下:
static print class print test static print class print test my_print xxx
個人理解:
@staticmethod 不需要訪問和類相關的屬性或數據(感覺只是概念上的區別,你這樣聲明了用的人就知道了,如果你非要在這個方法中訪問test.xxx 它就和@classmethod的作用一樣了。)
@classmethod 可以訪問和類相關(不和實例相關)的屬性,看 test.my_class_print("class print") 和 my_test.my_class_print("class print") 的結果都是class中定義的class_name 的值,非實例的值:xxx
如果你定義了一個方法它的返回值永遠和類的屬性及實例無關,結果永遠不變,就用@staticmethod
如果你定義了一個方法它的返回值和只和類的屬性有關,結果可變(比如上例,我用test.class_name="AAA"改變類的屬性值,my_class_print輸出的結果就改變了) .就用@classmethod