我是 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
,我创建了一个实例变量x.a
来掩盖类变量Obj.a
。但是,虽然我知道这(至少部分)与 Python 的其余赋值声明一致,但我对为什么类允许这样做感到困惑?天真地,我本以为x.a
应该改变的分配Foo.a
(因为这就是它所指的那个点)或者指的是x.a
在分配之前应该是一个错误(例如,“没有实例属性'a'。”)。
为什么允许这种行为。对于我们这些 Python 新手来说,这种行为在其他 OO 范式中对应什么?
换一种说法:我想不出你可以在哪里说x.a
并且让它变得意思Obj.a
,然后在下一行中说x.a = ...
,让它不再意思Obj.a
。虽然我只是不记得了,但有可能,一个例子 - 或者确认没有这样的事情 - 将是一个完美的答案。