我是Python的新手,对我所看到的一些行为感到困惑.如果我定义
class Obj():
a = 1
b = 2
然后创建一个实例
x = Obj()
一切都很好:
print(Obj.__dict__)
print(x.__dict__)
print(x.a,Obj.a)
产生
{'a': 1, '__module__': '__main__', 'b': 2, '__doc__': None}
{}
(1, 1)
但如果我
x.a = 20
我明白了
{'a': 1, '__module__': '__main__', 'b': 2, '__doc__': None}
{'a': 20}
(20, 1)
我理解,最初,a是类变量Foo.a,并且最初没有实例变量a.我也明白,那时候. x.a只是指Obj.a.我也明白,当我分配给x.a时,我创建了一个掩盖类变量Obj.a的实例变量x.a.但是,虽然我知道这(至少部分地)与Python的其他分配声明一致,但我很困惑为什么允许这样的类?天真地,我已经预料到对xa的赋值应该改变Foo.a(因为那是它所指到的那个)或者在赋值之前引用xa应该是一个错误(例如,“没有实例属性’a’.“).
为什么允许这种行为.什么 – 对于我们这些刚接触Python的人来说 – 这种行为是否与其他OO范例相对应?
换句话说:我想不出任何你可以说x.a的地方,并且它意味着Obj.a然后,在下一行中,说x.a = …并且它不再意味着Obj.a.虽然我只是不记得,但有一个例子 – 或确认没有这样的事情 – 将是一个完美的答案.