Python 类变量与实例变量

问题描述 投票:0回答:1
class Animal:
    x = {}
    y = 0
    def __init__(self):
        pass


animal1 = Animal()
animal2 = Animal()

animal1.x['num'] = 14
animal1.y = 14

print(animal2.x)
print(animal2.y)

输出:

{'数字':14}

0

为什么字典被视为类变量,但 int 对于每个实例都是唯一的?我对对象和类还很陌生,我只是在搞乱事情并注意到了这一点。

我预计两者都保持不变

python class object instance-variables class-variables
1个回答
0
投票

这与类型无关,而是与重新绑定和名称遮蔽有关。当您将“直接”分配给实例的属性时,您将在该实例上绑定该名称的属性。所以 animal1.y = 14 表示“对于这个特定实例,它应该有一个名为

y
且值为
14
的属性”。该类具有同名属性并不重要,这些属性仅在
reading
属性时作为后备找到(我在这里掩盖的描述符协议有一些奇怪之处,但这是一般规则) . 相比之下,当您说

animal1.x['num'] = 14

时,您并不是在写信给 
x
。您正在从 
animal1.x
中读取(由于实例缺少该属性,因此它是从类中读取的),然后将
into
写入您刚刚读取的内容。该行为与您所说的完全一样: xalias = animal1.x xalias['num'] = 14

animal1.x

显然没有被写入分解版本中,也没有被写入紧凑版本中,您只是通过别名修改了

dict
如果您改为说 

animal1.x = {'num': 14}

,它的行为就像

animal1.y = 14
一样;该实例将获得其自己的名为
x
的阴影属性,该属性通过其自己的单独字典将
x
从类中隐藏,因为您将一个新对象(“写入”)绑定到实例上的属性。
    

© www.soinside.com 2019 - 2024. All rights reserved.