Множественное наследование не работает должным образом

У меня есть следующий фрагмент кода:

class A:
    def __init__(self):
        self._a = 1


class B:
    def __init__(self):
        self._b = 2


class C(A, B):
    def __init__(self):
        super(C, self).__init__()
        self._c = 3

c = C()

Результирующий объект не имеет атрибута _b, и фактически __init__() B никогда не вызывается. Я ожидал, что __init__() методы обоих родителей будут вызываться один за другим. Я ошибся? Я не нашел противоречивой информации.

(Я использую python 3.6)


person Nadav Schweiger    schedule 25.07.2019    source источник
comment
У каждого __init__ должен быть super вызов, чтобы цепочка работала.   -  person tzaman    schedule 25.07.2019


Ответы (1)


Когда вы просто упоминаете super, возникает путаница, какой родитель назвать, A или B. Таким образом, он, естественно, вызывает первого и останавливается.

Чтобы вызвать оба родительских конструктора, вы должны указать это явно. См. Приведенный ниже код.

class A:
    def __init__(self):
        print("a")
        self._a = 1


class B:
    def __init__(self):
        print("b")
        self._b = 2


class C(B, A):
    def __init__(self):
        A.__init__(self)
        B.__init__(self)
        self._c = 3

c = C()

Чтобы узнать больше об этом, прочтите отличный ответ здесь: https://stackoverflow.com/a/50465583/4578111

person venkata krishnan    schedule 25.07.2019