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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值