zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Pytest之自定义mark
    Pytest之skip、skipif、xfail
    Pytest之fixture
    Pytest之断言
    Pytest之收集用例及命令行参数
    Pytest之基本介绍
    Python接口自动化之动态数据处理
    Python接口自动化之接口依赖
    关于激光纵模、横模与锁模技术的理解 Label:Research
    如何快速设计一个FIR滤波器 Label:Research
  • 原文地址:https://www.cnblogs.com/champaign/p/11004888.html
Copyright © 2011-2022 走看看