Эффектное объяснение. Это имеет больше смысла сейчас после прочтения целей для последовательности.

class First(object):
    def __init__(self):
        print "first"

class Second(First):
    def __init__(self):
        print "second"

class Third(First, Second):
    def __init__(self):
        print "third"

ник

Почему Python не может создать последовательную MRO? Мне кажется, это довольно ясно

Поиск в первом, если метод не существует в третьемПоиск во втором, если метод не существует в первом

Но если вы попробуете это:

TypeError: Error when calling the metaclass bases
    Cannot create a consistent method resolution
order (MRO) for bases First, Second
 Petya Kostyukevich14 дек. 2017 г., 09:35
Проверьте этот вопросstackoverflow.com/questions/29214888/...
 BrenBarn14 дек. 2017 г., 09:32
Я не понимаю, что ваши предполагаемые два шага даже должны означать. Что значит «если не существует»? Все три класса существуют.
 Derek 朕會功夫14 дек. 2017 г., 09:33
@BrenBarn Я случайно съел там слово.

Ответы на вопрос(1)

Решение Вопроса

MRO должен удовлетворять следующим ограничениям:

Если класс наследует от нескольких суперклассов, те, которые он перечисляет ранее в списке суперклассов, должны появляться в MRO раньше, чем те, которые он перечисляет позже.Каждый класс в MRO должен предшествовать любому из его суперклассов.

В предложенной вами иерархии нет возможных заказов, соответствующих этим ограничениям. Поскольку третий определен как наследник от первого до второго, первый должен предшествовать второму в MRO. Но поскольку второе наследуется от первого, второе должно предшествовать первому в MRO. Это противоречие не может быть урегулировано.

Вы можете прочитать больше о точном методе, который Python использует для вычисления MRO, который называетсяC3 алгоритм линеаризации.

 Łukasz Rogalski14 дек. 2017 г., 09:38
C3 алгоритм линеаризации это обязательно прочитать.
 Derek 朕會功夫14 дек. 2017 г., 09:40
Эффектное объяснение. Это имеет больше смысла сейчас после прочтения целей для последовательности.

Ваш ответ на вопрос