我在编写时遇到下面情况
>>> class A:
... a = 0
... def __init__(self):
... self.a += 1
... print(self.a)
...
>>> a1 = A()
1
>>> a1.a
1
>>> a2 = A()
1
>>> a2.a
1
>>> id(a1.a)
140725769696040
>>> id(a2.a)
140725769696040
明明a1.a和a2.a指向的是同一个对象,且都执行了+1操作,为什么结果没变
下面代码完成了我预期的功能,但上面是什么情况
>>> class A:
... a = 0
... def __init__(self):
... A.a += 1
... print(self.a)
...
>>> a1 = A()
1
>>> a1.a
1
>>> a2 = A()
2
>>> a2.a
2
>>> id(a1.a)
140725769696072
>>> id(a2.a)
140725769696072
环境版本
python: 3.11.9
系统: windows10
你遇到的问题是因为你在类 A 中定义了一个类变量 a,而在 init 方法中,你使用了 self.a,这会创建一个实例变量 a,覆盖了类变量 a。
当你创建实例 a1 和 a2 时,每个实例都有自己的 a 实例变量,而不是共享类变量 a。因此,每次实例化时,self.a 都是从 0 开始,并且 self.a += 1 只影响当前实例的 a。
你新写的代码里的A.a 是一个类变量,所有实例共享它,因此每次实例化时,A.a 都会增加。当你打印 self.a 时,self.a 实际上是访问类变量 A.a,因为实例 a1 和 a2 没有自己的 a 实例变量。因此,print(self.a) 打印的是类变量 A.a 的值。
补充
使用 cls 参数来实现这一点,这样在继承时可以修改子类的属性,而不是父类的。可以通过在方法中使用 @classmethod 装饰器来实现。