English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Основной курс Python

Управление потоком в Python

Функции Python

Типы данных Python

Операции с файлами в Python

Объекты и классы в Python

Даты и время в Python

Продвинутые знания Python

Руководство Python

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

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

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

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

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

Пример

class Base1:
    пропустить
class Base2:
    пропустить
class MultiDerived(Base1, Base2):
    пропустить

Здесь,MultiDerivedПроисходит из классаBase1иBase2.

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

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

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

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

Ниже приведен пример с соответствующим визуальным эффектом.

class Base:
    пропустить
class Derived1(Base):
    пропустить
class Derived2(Derived1):
    пропустить

В этом случае,Derived1ИзBaseПроизводный,Derived2ИзDerived1Производный.

Порядок вызова методов в Python

Каждый класс в Python производен от класса object. Это最基本的 тип в Python.

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

# Вывод: True
print(issubclass(list, object))
# Вывод: True
print(isinstance(5.5, object))
# Вывод: True
print(isinstance("Hello", object))

В случае многопереопределения, в текущем классе сначала будет搜索 любую указанную функцию. Если не найдено, то поиск продолжится в глубину优先, слева направо, в родительские классы, не повторяя поиск в одном и том же классе.

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

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

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

>>> MultiDerived.__mro__
(<class '__main__.MultiDerived'>,
 <class '__main__.Base1'>,
 <class '__main__.Base2'>,
 <class 'object'>)
>>> MultiDerived.mro()
[<class '__main__.MultiDerived'>,
 <class '__main__.Base1'>,
 <class '__main__.Base2'>,
 <class 'object'>]

Это пример稍微 сложного多重ного наследования с его визуализацией и 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
# Вывод:
# [<class '__main__.M'>, <class '__main__.B'>,
# <class '__main__.A'>, <class '__main__.X'>,
# <class '__main__.Y'>, <class '__main__.Z'>,
# <class 'object'>]
print(M.mro())

Пожалуйста, обратитесь к этому содержанию, чтобы узнать больше,Обсуждение MRO,и понять способ вычисления реальных алгоритмов.