When I instantiate a python subclass it overwrites base class' attribute
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | class A(object): x = 0 y = 0 z = [] def __init__(self): super(A, self).__init__() if not self.y: self.y = self.x if not self.z: self.z.append(self.x) class B(A): x = 1 class C(A): x = 2 print C().y, C().z print B().y, B().z |
输出是
1 2 | 2 [2] 1 [2] |
为什么
是的,这是因为一个是不可变的,而另一个是不可变的,或者更确切地说,你正在改变一个而不是另一个。(重要的不是对象是否"可变",重要的是你是否真的改变了它。)这也是因为你使用的是类变量而不是实例变量(见这个问题)。
在类定义中,创建三个类变量,在类的所有实例之间共享。创建类的实例后,如果在该实例上执行
当执行
但是,在执行
结果是,读取属性的值与分配给它的值不同。当您读取EDOCX1的值〔0〕时,您可能正在检索一个存储在类中并在所有实例之间共享的值。但是,如果将值赋给
当python评估
这不会影响
要解决此问题,请在构造函数内创建数组,从而分配:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | class A(object): x = 0 y = 0 z = None def __init__(self): super(A, self).__init__() if not self.y: self.y = self.x if not self.z: # create a new list z = [self.x] class B(A): x = 1 class C(A): x = 2 print C().y, C().z print B().y, B().z |
问题是,
在
如果你把两条
1 2 | 1 [1] 2 [1] |