类变量的行为

Ree*_*jan 1 python oop class python-2.7 python-3.x

>>> class a:
...     b=5
...     def __init__(self,x,y):
...             self.x=x
...             self.y=y
...
>>> p=a(5,6)
>>> q=a(5,6)
>>> a.b
5
>>> a.b+=1
>>> p.b
6
>>> q.b
6
>>> q.b-=1
>>> q.b
5
>>> p.b
6
>>> a.b
6
Run Code Online (Sandbox Code Playgroud)

如您所见,在通过实例的方法更改类变量时,同样不会反映在类变量和其他实例的类变量中.为什么会这样?

Jim*_*ard 6

因为q.b -= 1使用名称创建实例变量b,请查看__dict__:

q.__dict__
{'b': 4, 'x': 5, 'y': 6}

p.__dict__
{'x': 5, 'y': 6}
Run Code Online (Sandbox Code Playgroud)

q.b不同于a.b,你a.b在任务后被遮蔽了.请注意,这不是Python 3的特定问题,Python 2也以相同的方式运行.

这在语言参考的赋值语句部分中明确说明:

注意:如果对象是类实例,并且属性引用出现在赋值运算符的两侧,则RHS表达式a.x可以访问实例属性或(如果不存在实例属性)类属性.LHS目标a.x始终设置为实例属性,必要时创建它.因此,两次出现a.x不必引用相同的属性:如果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
Run Code Online (Sandbox Code Playgroud)

此描述不一定适用于描述符属性,例如使用创建的属性property().