Python中使用@staticmethod 和 @classmethod 装饰器

认识static

在java中有static关键字,标识静态变量,或者静态方法,也叫类变量、类方法,与一般的实例变量区别在于,它是类共有的,可以通过类名直接访问,并且永远保持着最新修改的值,而成员变量则是类实例特有的一个副本,通过类的实例进行访问,当前类实例修改了成员变量的值只会对本实例有用,并不会影响其他类实例所持有的变量的值

在python中则使用@staticmethod 或者 @classmethod来完成类似的事情!

1、在python中定义类和方法后,一般是通过类的对象来访问具体的方法,在定义普通成员方法时,第一个参数默认是self,代表本类实例

2、如果使用@staticmethod来装饰一个方法,则不需要传递self,外部访问时可以直接通过类名进行访问

3、如果使用@classmethod来装饰一个方法,不需要传递self,但需要传递一个cls来代表自身类,外部访问时可以直接通过类名进行访问


下面来看看代码,主要关注使用方法及改变成员变量的影响

class demo(object):

    __c = 10; # 定义一个private的变量

    def get_c(self):
        print self.__c
        return self.__c

    def add(self,a):
        """
        这个是普通方法,我们改变了一次__c的值,但这只对当前的类实例有效
        :param a:
        :return:
        """
        self.__c = 11
        return self.__c + a

    @staticmethod
    def add2(a):
        """
        这是一个静态方法,我们改变了一次__c的值,这个改变对所有类实例都有效
        :param a:
        :return:
        """
        demo.__c = 12 # 改变了__c的值
        return demo.__c + a

    @classmethod
    def add3(cls,a):
        """
        这是一个类方法,我们改变了一次__c的值,这个改变对所有类实例都有效
        :param a:
        :return:
        """
        cls.__c = 13 # 改变了__c的值
        return cls.__c + a
##################################################################################
test = demo() # 初始化实例test
test1 = demo() # 初始化实例test1

test.get_c() #获取__c 变量值
test1.get_c() #获取__c 变量值

test.add(2) # 通过test 实例调用普通方法add改变__c的值,它并不会影响到test1的__c的值

test.get_c()
test1.get_c()
输出结果:

10
10
11
10

######################################################################

test = demo() # 初始化实例test
test1 = demo() # 初始化实例test1
test.get_c() #获取__c 变量值
test1.get_c() #获取__c 变量值

demo.add2(2) # 通过类名直接调用add2方法,改了__c的值,这对所有的实例都有效

test.get_c()
test1.get_c()
输出结果:

10
10
12
12

######################################################################

test = demo() # 初始化实例test
test1 = demo() # 初始化实例test1
test.get_c() #获取__c 变量值
test1.get_c() #获取__c 变量值

demo.add3(2) # 通过类名直接调用add3方法,改了__c的值,这对所有的实例都有效

test.get_c()
test1.get_c()
输出结果:

10
10
13
13

有不对的地方欢迎指正 (*^__^*) 


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lbxoqy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值