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 对于每个实例都是唯一的?我对对象和类还很陌生,我只是在搞乱事情并注意到了这一点。
我预计两者都保持不变
这与类型无关,而是与重新绑定和名称遮蔽有关。当您将“直接”分配给实例的属性时,您将在该实例上绑定该名称的属性。所以 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
从类中隐藏,因为您将一个新对象(“写入”)绑定到实例上的属性。