Уточнение MRO в классах нового стиля
В отличие от старого Классы -style, классы нового стиля исследуют свои базовые классы, чтобы установить порядок разрешения методов (MRO). Этот порядок определяет последовательность поиска методов при вызове метода для объекта.
Разрешение конфликтов наследования с помощью MRO
Ключевое различие между MRO в новых Классы стиля и старого стиля возникают, когда один и тот же класс-предок появляется несколько раз в иерархии наследования. Например, рассмотрим следующий случай наследования алмазов:
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
Legacy-Style MRO:
В классах устаревшего стиля порядок разрешения будет D - B - A - C - A. Здесь при вызове D .amethod(), определение в A находится первым и переопределяет определение в C.
New-Style MRO:
Для классов нового стиля MRO выглядит следующим образом:
D.__mro__
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>,
<class '__main__.A'>, <type 'object'>)
Обратите внимание, что A появляется в этом порядке только один раз, после всех своих подклассов. Это гарантирует, что переопределения в подклассах, такие как переопределение метода в C, имеют приоритет.
Понимание важности MRO
MRO в классах нового стиля разрешает конфликты наследования разумно, позволяя переопределениям работать правильно. Это также позволяет избежать ситуаций, когда в порядке разрешения появляется несколько определений одного и того же метода, что приводит к неоднозначному поведению. Понимая и эффективно используя MRO, разработчики могут создавать надежные и легко поддерживаемые иерархии наследования в Python.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3