В книге Python в двух словах (второе издание) есть пример, который использует
старых классов стилей, чтобы продемонстрировать, как методы будут решены в классическом порядке разрешения и
, как он отличается с новым порядком.Метод разрешения разрешения (MRO) в классах нового стиля?
Я попробовал такой же пример, переписав пример в новом стиле, но результат не отличается от того, что было получено со старыми классами стилей. Версия python, которую я использую для запуска примера, - 2.5.2. Ниже приведен пример:
class Base1(object):
def amethod(self): print "Base1"
class Base2(Base1):
pass
class Base3(object):
def amethod(self): print "Base3"
class Derived(Base2,Base3):
pass
instance = Derived()
instance.amethod()
print Derived.__mro__
Вызов instance.amethod()
печатает Base1
, но согласно моему пониманию MRO с новым стилем классов выход должен был Base3
. ВЫЗОВ МАСТЕРА Derived.__mro__
печатаю:
(<class '__main__.Derived'>, <class '__main__.Base2'>, <class '__main__.Base1'>, <class '__main__.Base3'>, <type 'object'>)
Я не уверен, что мое понимание MRO с новыми классами стиля неверно или что я делаю глупую ошибку, которую я не смог обнаружить. Пожалуйста, помогите мне лучше понять MRO.
«[класс предков] [[]] вынужден прийти в порядке разрешения только один раз и после всех его подклассов, так что переопределения (т. Е. Переопределение C элемента x) действительно работают разумно». - * Epiphany! * Благодаря этому предложению я снова могу сделать MRO в своей голове. \ o/Большое спасибо. – Esteis