9.5 类变量和类方法
变量和方法有两种类型——类变量与实例变量;类方法和实例方法,它们根据究竟是类还是实例拥有这些变量/方法来进行分类。
之前的实例变量由类的每一个独立的实例所拥有。在这种情况下,每个实例都拥有属于它自己的变量的副本,也就是说,它们不会被共享,也不会以任何方式与其它不同实例中的相同名称的变量产生关联。
而类变量(Class Variable)是共享的(Shared),即它们可以被属于该类的所有实例访问。该类变量只拥有一个副本,当任何一个实例对类变量作出改变时,发生的变动将在其它所有实例中都会得到体现。
定义一个类变量是在类的内部,所有类方法的外部。
类方法是一个属于类而非属于实例的方法。一般用来对类变量进行操作。在Python中使用装饰器(Decorator)@classmethod将一个方法标记为类方法。
相对于self是代表某一个实例本身,cls代表这个类本身,可以用cls来引用类变量。
例如给学生类加入一个类变量和类方法:9.4-类变量和类方法.py
# 类变量和类方法
class Student:
"""
Student类说明文档
"""
# 类变量,标明学生数目
stu_number = 0
# 带其他参数的构造函数
def __init__(self, name, sex, age):
self.name = name
self.sex = sex
self.age = age
def __str__(self):
return '学生:{},性别:{},年龄:{}。'.format(self.name, self.sex, self.age)
# 定义方法
def bao_ming(self):
print('学生{}报名。'.format(self.name))
Student.stu_number += 1
def bi_ye(self):
print('学生{}毕业了。'.format(self.name))
Student.stu_number -= 1
@classmethod
def how_many(cls):
print('学生数目:{}'.format(cls.stu_number))
# 带参数的构造函数,创建实例
s1 = Student('lisi', 'male', 24)
s1.bao_ming()
Student.how_many()
s2 = Student('wangwu', 'male', 23)
s2.bao_ming()
Student.how_many()
s1.bi_ye()
Student.how_many()
s2.bi_ye()
Student.how_many()
# 类变量为所有实例所共享
print(s1.stu_number)
print(s2.stu_number)
# 实例变量为实例自己所有
print(s1.name)
print(s2.name)
执行结果为:
学生lisi报名。
学生数目:1
学生wangwu报名。
学生数目:2
学生lisi毕业了。
学生数目:1
学生wangwu毕业了。
学生数目:0
0
0
lisi
wangwu