Python继承与字典变异

时间:2016-04-28 17:04:05

标签: python inheritance dictionary

我很好奇在字典突变的情况下继承是如何工作的,我一直认为每个新实例都会重新创建继承的类。

class A(object):
    test = {"B": 0}

    def change_test(self, index):
        self.test["B"] += index

    def __init__(self, **kwargs):
        self.change_test(self.index)
        super(A, self).__init__(**kwargs)


class B(A):
    index = 1
    def print_test(self):
        print self.test


class C(A):
    index = 2
    def print_test(self):
        print self.test

b = B()
b.print_test()

c = C()
c.print_test()

为什么这会返回{' B':1} {' B':3}而不是{' B':1} {' B':2}?

2 个答案:

答案 0 :(得分:3)

类变量testA及其子代的实例之间共享。

print A.test is B.test # True
print B.test is C.test # True

最初,test{"B": 0}。 初始化b时,系统会调用change_test中的A,因为B会从A继承__init__。现在test{"B": 1} 。之后,您初始化c,这会导致另一个change_testindex的通话2.现在test{"B": 3},因为1 + 2 = 3。 / p>

答案 1 :(得分:2)

如前所述,变量是在import - 时创建的,不会重新创建。此变量将被共享,因为dict(但也list,...)是可变的,也会被此类的所有实例更改。要解决此问题,请在实例创建时创建变量:

class A(object):

    def change_test(self, index):
        self.test["B"] += index

    def __init__(self, **kwargs):
        self.test = {"B": 0}          # Create it here!!!
        self.change_test(self.index)
        super(A, self).__init__(**kwargs)

通常只保存不可变类型(int,...)以将其用作类变量。

另见: