面向对象之实例属性和类属性
类属性 是直接在类中定义的属性
class Animal(object):
name = 'dog'
# def __init__(self, name):
# self.name = name
an = Animal()
print(an.name) # dog
print(Animal.name) # dog
an.name = 'Blob' # 创建实例属性
print(an.name) # Blob
print(Animal.name) # dog
del an.name # 删除st.name 实例属性
print(an.name) # 打印出来的结果 会查找到类属性
小结
从上面的例子可以看出,在编写程序的时候,千万不要对实例属性和类属性使用相同的名字,
因为相同名称的实例属性将屏蔽掉类属性,但是当你删除实例属性后,再使用相同的名称,访问到的将是类属性。
练习
为了统计学生人数,可以给Student类增加一个类属性,每创建一个实例,该属性自动增加:
class Student(object):
count = 0
def __init__(self, num):
if not isinstance(num, int):
raise TypeError('bad operand type')
self.num = num
def _number(self):
print('人数1:', self.num)
f_class = Student(90)
s_class = Student(80)
def add(_classes):
_classes._number()
Student.count += 1
print(Student.count)
# 测试:
if Student.count != 0:
print('测试失败!')
else:
add(f_class)
if Student.count != 1:
print('测试失败!')
else:
add(s_class)
if Student.count != 2:
print('测试失败!')
else:
print('Students count:', Student.count)
print('测试通过!')
小结
实例属性属于各个实例所有,互不干扰;
类属性属于类所有,所有实例共享一个属性;
不要对实例属性和类属性使用相同的名字,否则将产生难以发现的错误。
关注一波!喜欢一波!本人是前端菜鸟,正在做自己的个人博客邓鹏的博客,欢迎来交流学习, 使用的技术 vue + koa2 + mysql + php + nginx!