章节
问答
课签
笔记
评论
占位
占位

Python类属性和实例属性的优先级

可以看到,属性可以分为类属性和实例属性,那么问题就来了,如果类属性和实例属性名字相同时,会怎么样,这就涉及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)
||
1
2
# Enter a code
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
提交
重置代码
||

请验证,完成请求

由于请求次数过多,请先验证,完成再次请求

加群二维码

打开微信扫码自动绑定

您还未绑定服务号

绑定后可得到

  • · 粉丝专属优惠福利
  • · 大咖直播交流干货
  • · 课程更新,问题答复提醒
  • · 账号支付安全提醒

收藏课程后,能更快找到我哦~

使用 Ctrl+D 可将课程添加到书签

邀请您关注公众号
关注后,及时获悉本课程动态

举报

0/150
提交
取消
全部 精华 我要发布

最新回答 / weixin_慕妹7068926
私有化就是在外部无法访问,只能在类的内部可以进行访问

最新回答 / 慕粉1852291106
两种都没法修改,但是加了__之后外部就没法直接Animal.count获取了,得def get_count(self)

最赞回答 / qq_慕妹2150756
但是如果没有__,那么def语句里面的
Animal.__count = Animal.__count + 1
不就在每次新建实例的时候修改了count吗

最新回答 / 慕哥3042730
实例属性的优先级高于类属性的优先级。实例dog拥有loc这个属性,但是不拥有count这个属性。Animal类拥有loc和count这两个属性。你用实例来访问属性,如果实例和类都拥有此属性,就会优先展示实例属性。但是如果实例不具有此属性,而类具有此属性,会展示类的属性。

讲师回答 / 咚咚呛
可以思考下报错背后具体的原因哈,这个习题成功的演示就是会报错的。可以看到,在初始化的时候,__init__()方法里面是可以把Animal.__count打印出来的,但是在外部再次尝试打印的时候,则失败了;如果把__count改为count,则不会报错。
全部 我要发布
最热 最新
只看我的

本次提问将花费2个积分

你的积分不足,无法发表

为什么扣积分?

本次提问将花费2个积分

继续发表请点击 "确定"

为什么扣积分?

账号登录 验证码登录

遇到问题
忘记密码

代码语言