Принципиальное различие между порядком разрешения для устаревших классов и классов нового стиля возникает, когда один и тот же класс предков встречается более одного раза в «наивном» подходе, основанном на глубине - например, рассмотрим случай «наследования алмазов»:
>>> class A: x = 'a'
...
>>> class B(A): pass
...
>>> class C(A): x = 'c'
...
>>> class D(B, C): pass
...
>>> D.x
'a'
здесь, в традиционном стиле, порядок разрешения - D - B - A - C - A: поэтому при поиске Dx A является первой базой в разрешении, чтобы решить ее, тем самым скрывая определение в C. В то время как:
>>> class A(object): x = 'a'
...
>>> class B(A): pass
...
>>> class C(A): x = 'c'
...
>>> class D(B, C): pass
...
>>> D.x
'c'
>>>
здесь, в новом стиле, заказ:
>>> D.__mro__
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>,
<class '__main__.A'>, <type 'object'>)
с A
, вынужденным приходить в порядке разрешения только один раз и после всех его подклассов, так что переопределения (то есть переопределение C элемента x
) на самом деле работают разумно.
Это одна из причин, по которой следует избегать классов в старом стиле: множественное наследование с «ромбовидными» шаблонами просто не работает с ними разумно, в то время как это происходит с новым стилем.