类变量的行为

时间:2017-11-17 16:55:13

标签: python python-3.x python-2.7 class oop

>>> 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

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

1 个答案:

答案 0 :(得分:6)

由于q.b -= 1创建了名为b的实例变量,请查看__dict__

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

p.__dict__
{'x': 5, 'y': 6}

q.ba.b不同,您在分配后隐藏a.b。请注意,这不是Python 3特有的问题,Python 2也以相同的方式运行。

语言参考的assignment statement section中明确说明了这一点:

  

注意:如果对象是类实例并且赋值运算符的两侧都出现属性引用,则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
     

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