Множественное наследование Python: что это такое и как его использовать?

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

Множественное наследование Python

Класс может быть производным от нескольких базовых классов в Python, как и в C ++. Это называется множественным наследованием.

При множественном наследовании функции всех базовых классов наследуются в производный класс. Синтаксис множественного наследования аналогичен одиночному наследованию.

пример

 class Base1: pass class Base2: pass class MultiDerived(Base1, Base2): pass

Здесь класс MultiDerived является производным от классов Base1 и Base2.

Множественное наследование в Python

Класс MultiDerived наследуется от классов Base1 и Base2.

Многоуровневое наследование Python

Мы также можем наследовать от производного класса. Это называется многоуровневым наследованием. В Python он может быть любой глубины.

При многоуровневом наследовании функции базового класса и производного класса наследуются в новый производный класс.

Ниже приводится пример с соответствующей визуализацией.

 class Base: pass class Derived1(Base): pass class Derived2(Derived1): pass

Здесь класс Derived1 является производным от базового класса, а класс Derived2 является производным от класса Derived1.

Многоуровневое наследование в Python

Порядок разрешения методов в Python

Каждый класс в Python является производным от objectкласса. Это самый базовый тип в Python.

Таким образом, технически все другие классы, встроенные или определяемые пользователем, являются производными классами, а все объекты являются экземплярами objectкласса.

 # Output: True print(issubclass(list,object)) # Output: True print(isinstance(5.5,object)) # Output: True print(isinstance("Hello",object))

В сценарии множественного наследования любой указанный атрибут сначала ищется в текущем классе. Если он не найден, поиск продолжается в родительских классах по принципу «сначала в глубину, влево-вправо» без поиска одного и того же класса дважды.

Так, в приведенном выше примере MultiDerivedкласса порядок поиска ( MultiDerived, Base1, Base2, object). Этот порядок также называется линеаризацией MultiDerivedкласса, а набор правил, используемых для нахождения этого порядка, называется порядком разрешения методов (MRO) .

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

MRO класса можно рассматривать как __mro__атрибут или mro()метод. Первый возвращает кортеж, а второй - список.

 >>> MultiDerived.__mro__ (, , , ) >>> MultiDerived.mro() (, , , )

Вот немного более сложный пример множественного наследования и его визуализация вместе с MRO.

Визуализация множественного наследования в Python
 # Demonstration of MRO class X: pass class Y: pass class Z: pass class A(X, Y): pass class B(Y, Z): pass class M(B, A, Z): pass # Output: # (, , # , , # , , # ) print(M.mro())

Вывод

 (,,,,,,)

Чтобы узнать фактический алгоритм расчета MRO, посетите раздел «Обсуждение MRO».

Интересные статьи...