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)
如您所见,在通过实例的方法更改类变量时,同样不会反映在类变量和其他实例的类变量中.为什么会这样?
因为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创建新的实例属性作为赋值的目标:Run Code Online (Sandbox Code Playgroud)class Cls: x = 3 # class variable inst = Cls() inst.x = inst.x + 1 # writes inst.x as 4 leaving Cls.x as 3此描述不一定适用于描述符属性,例如使用创建的属性
property().
| 归档时间: |
|
| 查看次数: |
91 次 |
| 最近记录: |