可以看到,属性可以分为类属性和实例属性,那么问题就来了,如果类属性和实例属性名字相同时,会怎么样,这就涉及Python中类属性和实例属性的优先级的问题了。
我们可以做一个实验,在前面类定义的基础上,在实例属性中,也初始化一个localtion的属性。
class Animal(object): localtion = 'Asia' def __init__(self, name, age, localtion): self.name = name self.age = age self.localtion = localtion
接着我们初始化两个实例,并把localtion打印出来。
dog = Animal('wangwang', 1, 'GuangDong') cat = Animal('mimi', 3, 'ChongQing') print(dog.localtion) # ==> GuangDong print(cat.localtion) # ==> ChongQing print(Animal.localtion) # ==> Asia
可见,在类属性和实例属性同时存在的情况下,实例属性的优先级是要高于类属性的,在操作实例的时候,优先是操作实例的属性。
另外,当实例没有和类同名的时候,通过实例对象,依然可以访问到类属性。
class Animal(object): localtion = 'Asia' def __init__(self, name, age): self.name = name self.age = age cat = Animal('mimi', 3) print(cat.localtion) # ==> Asia
那通过实例,可不可以修改类属性呢?我们来尝试一下:
cat.localtion = 'Africa' print(Animal.localtion) # ==> Asia
这里依然打印了Asia,可见通过实例是无法修改类的属性的,事实上,通过实例方法修改类属性,只是给实例绑定了一个对应的实例属性:
# 新增的实例属性 print(cat.localtion) # ==> Africa
因此,需要特别注意,尽量不要通过实例来修改类属性,否则很容易引发意想不到的错误。
请把上节的 Animal类属性 count 改为 __count,再试试能否从实例和类访问该属性。
把count改为私有__count,这样实例变量在外部无法修改__count
参考代码:
class Animal(object): __count = 0 def __init__(self, name): Animal.__count = Animal.__count + 1 self.name = name print(Animal.__count) p1 = Animal('Cat') p2 = Animal('Dog') print(Animal.__count)
请验证,完成请求
由于请求次数过多,请先验证,完成再次请求
打开微信扫码自动绑定
绑定后可得到
使用 Ctrl+D 可将课程添加到书签
举报