В этом руководстве вы узнаете о множественном наследовании в Python и о том, как использовать его в своей программе. Вы также узнаете о многоуровневом наследовании и порядке разрешения методов.
Множественное наследование Python
Класс может быть производным от нескольких базовых классов в Python, как и в C ++. Это называется множественным наследованием.
При множественном наследовании функции всех базовых классов наследуются в производный класс. Синтаксис множественного наследования аналогичен одиночному наследованию.
пример
class Base1: pass class Base2: pass class MultiDerived(Base1, Base2): pass
Здесь класс MultiDerived является производным от классов Base1 и Base2.

Класс MultiDerived наследуется от классов Base1 и Base2.
Многоуровневое наследование Python
Мы также можем наследовать от производного класса. Это называется многоуровневым наследованием. В Python он может быть любой глубины.
При многоуровневом наследовании функции базового класса и производного класса наследуются в новый производный класс.
Ниже приводится пример с соответствующей визуализацией.
class Base: pass class Derived1(Base): pass class Derived2(Derived1): pass
Здесь класс Derived1 является производным от базового класса, а класс Derived2 является производным от класса Derived1.

Порядок разрешения методов в 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.

# 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».