python-静态成员函数和classmethod装饰器

1. python类中定义的变量,如果不加self就不归属于类,只有在第一次实例化时进行初始化

class Count1:
    count = 0
    def __init__(self):
        Count1.count +=1
        self.num  = 1
        # count += 1 不允许  
    def get_count(self):
        return Count1.count

a1 = Count1()
a2 = Count1()
a2.num = 2

print("a1[%s:%s]a2[%s:%s]" % (a1.get_count(),a1.num,a2.get_count(),a2.num) )
print(Count1.get_count())

执行结果:

ggg@ggg-X550JX ~/test_demo $ python classmethod2.py 
a1[2:1]a2[2:2]
Traceback (most recent call last):
  File "classmethod2.py", line 15, in <module>
    print(Count1.get_count())
TypeError: get_count() missing 1 required positional argument: 'self'

通过执行结果中num的的区别,可以看出Count1对象确实生成了两个实例,而两个实例中count都等于2,可见当a2在构造过程中并没有初始化count变量到0,所以在类中直接定义的变量可认为静态变量。

并且count在类中进行调用时候不允许在成员函数中直接使用,比如第六行会被识别为未定义。因此这种变量不属于单个实例。

2. classmethod

 相对与上边的代码就多了一行@classmethod来修饰get_count()

class Count1:
    count = 0
    def __init__(self):
        Count1.count +=1
        self.num  = 1
        # count += 1 不允许  
    @classmethod
    def get_count(self):
        return Count1.count

a1 = Count1()
a2 = Count1()
a2.num = 2

print("a1[%s:%s]a2[%s:%s]" % (a1.get_count(),a1.num,a2.get_count(),a2.num) )
print(Count1.get_count())

查看执行结果:

ggg@ggg-X550JX ~/test_demo $ python classmethod2.py 
a1[2:1]a2[2:2]
2

现在可以看到直接用Count1这个类名就可以调用到get_count函数,也就是说get_count函数此时不归属于a1,a2实例,因此可以说加上classmethod修饰后的函数,变成了静态成员函数。

总结:

class里直接定义且不带self的变量是静态成员变量,只在第一次实例化该类时被初始化。加上classmethod修饰的成员函数会成为静态成员函数,不再归属于实例。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值