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")

 

執行結果如下:

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM