Python学习之路(面向对象之实例属性和类属性)

面向对象之实例属性和类属性

类属性 是直接在类中定义的属性

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!

推荐阅读更多精彩内容