对python中的静态类变量感到困惑

时间:2017-10-18 13:31:24

标签: python-3.x inheritance static-variables

这里有一些示例代码:

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个,每个类一个)。

有人可以解释这种行为吗?

干杯。

1 个答案:

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