类变量的行为
这个问题在这里已经有了答案:
由于qb -= 1
用名称b
创建一个实例变量,请查看您的__dict__
:
q.__dict__
{'b': 4, 'x': 5, 'y': 6}
p.__dict__
{'x': 5, 'y': 6}
qb
与ab
不同,在赋值之后你已经隐藏了ab
。 请注意,这不是Python 3的特定问题,Python 2也具有相同的行为。
这在语言参考的赋值语句部分有明确说明:
注意:如果对象是类的实例和属性参考的赋值运算符,表达RHS的两侧时, ax
可以访问任一的实例属性或者(如果没有实例属性存在)一类的属性。 LHS目标ax
始终设置为实例属性,并在必要时创建它。 因此, ax
的两次出现并不一定指向相同的属性:如果RHS表达式引用类属性,LHS将创建一个新的实例属性作为赋值的目标:
class Cls:
x = 3 # class variable
inst = Cls()
inst.x = inst.x + 1 # writes inst.x as 4 leaving Cls.x as 3
此描述不一定适用于描述符属性,例如使用property()
创建的property()
。