Проблема с множественным наследование в Python 3.6

class classColumn:
    def __init__(self):
        self.m = 0.5
        self.a = 800 * self.m
        self.b = 500 * self.m
        self.tp = 190 * self.m
        self.x = 400
        self.y = 400
        super().__init__()

class Line:
    def __init__(self):
        self.ve=3
        print ("line")



class Moment_W(Line, classColumn):
    def __init__(self):
        super().__init__()
        a=4+self.a
        print ("moment")
        print(self.ve)
        print(self.x)


#d=classColumn()
p=Moment_W()

В данном коде наследования атрибутов из ClassColumn не происходит. Вопрос, что я делаю не так? Я до этого пробовал очень похожий код. Немного другие имена переменных все работало. А тут голову сломал? может опечатка какая то я ее не вижу?


Ответы (1 шт):

Автор решения: nomnoms12

У обоих классов, от которых Вы наследуетесь, есть метод __init__. Чтобы не возникало вопросов, какой метод должна вызвать инструкция super().__init__(), придуманы алгоритмы разрешения порядка наследования.

В Python используется алгоритм MRO С3.

По этому алгоритму super().__init__() вызовет конструктор класса Line, и атрибут self.a не будет инициализирован, поэтому и возникает ошибка.

Вам нужно либо изменить порядок наследования, либо изменить сам конструктор.


Вы можете посмотреть полный порядок наследования с помощью метода mro:

print(Moment_W.mro())
[<class '__main__.Moment_W'>, <class '__main__.Line'>, <class '__main__.classColumn'>, <class 'object'>]
→ Ссылка