python @staticmethod和@classmethod的做用與區別

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

相關文章
相關標籤/搜索