版权声明:本文为博主原创文章,未经博主允许不得转载。 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修饰的成员函数会成为静态成员函数,不再归属于实例。