这里有一些示例代码:
class A:
staticvar=3;
def foo2(self):
print("------ Foo2")
print("static: "+str(A.staticvar));
print("instance: "+ str(self.staticvar));
class B(A):
def setStaticVar(self, num):
B.staticvar=num;
a=A();
b=B();
a.staticvar=7;
a.foo2();
b.setStaticVar(100);
a.foo2();
b.foo2();
结果如下:
------
static: 3
instance: 7 -->correct. Instance var modified
------
static: 3
instance: 7 --> Not correct. Why static var is not 100
------
static: 3
instance: 100 --> Correct, but this value should be shared between A and B
为什么会这样?不应该在A和B之间共享静态变量吗?为什么在b到b中修改它。
从这个例子来看,似乎每个类都有自己的静态var(从我的观点来看并不是真正的静态因为只有一个静态var而我们有2个,每个类一个)。
有人可以解释这种行为吗?
干杯。
答案 0 :(得分:0)
我怀疑你遇到的是名称解析问题。当你得到B.staticvar
时,解释器无法找到它并且回到它的超级类来尝试解析名称。在遍历A
时,解释器找到staticvar
并返回值。
但是,当您将值设置为B.staticvar
时,您会获得与“实例”案例相同的行为,其中添加了名为staticvar
的 new 属性B
。现在,当它尝试解析B
(或其实例)上的属性名称时,它会使用此新值而不会回退到A
。在Python中,继承一个类并不是要分享它的属性,它是关于设置一个回退类来解析未在子类中定义的名称(因此为什么不需要显式“覆盖”方法,以及为什么你如果您希望运行父函数,必须记得在super(A).method_name
内调用B.method_name
。
要获得您要求的行为,请在setStaticVar
中定义A
,和/或将其正文更改为A.staticvar=num