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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gang950502/article/details/81227555

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修饰的成员函数会成为静态成员函数,不再归属于实例。

猜你喜欢

转载自blog.csdn.net/gang950502/article/details/81227555
今日推荐