0

, поэтому я занимаюсь изучением чудесного мира Python 2.7 Множественное наследование и MRO, и я пробовал разные примеры во время чтения, и я наткнулся на что-то, что действительно меня озадачило.Python 2.7 MRO ведет себя странно

Итак, вы получили свой классические бриллиантовое MI пример:

class A: 
    def __init__(self): 
     print "A" 

class B(A): 
    pass 

class C(A): 
    def __init__(self): 
     print "C" 

class D(B, C): 
    pass 

instance = D() 

Во все MRO ресурсов, которые я прочитал, этот пример должен иметь МРО DBCA так инициализация D должна напечатать «C», но вместо того, чтобы его печатает "A". Странно, однако, когда я изменяю определение A, B, C или D как подкласс чего-то вроде int, он дает мне ожидаемое поведение печати «C»

Почему структура MRO структуры класса выглядит по-разному в зависимости от того, базовый класс - примитивный тип? это ошибка?

ответ

1

Как я набрал это I read a bit more про MRO и обнаружил, старый стиль MRO слева направо depth-first (который даст DBAC), а новый стиль - это алгоритм C3, который я предполагал использовать для всех классов python 2.7. Применение алгоритма C3 к новому классу стилей с этой иерархией наследования дает DBCA. В основном в версии 2.7 классы, наследующие от Object, - это новый стиль и классы, которые не являются старыми. Я вводил в заблуждение 2.7 с 3.0, где все классы наследуют от Object в любом случае. Поэтому, если какая-либо из оснований D унаследовала от класса нового стиля, они дали бы D новый MRO, иначе D в этом примере будет иметь MRO старого стиля.

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

Смежные вопросы