English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В этой статье вы узнаете, что такое множественное наследование в Python и как им можно использовать в программе. Вы также узнаете о многоуровневом наследовании и порядке разрешения методов.
Как и в C++, одинклассможно наследовать от нескольких базовых классов в Python. Это называется множественным наследованием.
В случае множественного наследования функции всех базовых классов наследуются производным классом. Грамматика множественного наследования похожа на одиночноенаследование.
class Base1: пропустить class Base2: пропустить class MultiDerived(Base1, Base2): пропустить
Здесь,MultiDerivedПроисходит из классаBase1иBase2.
Класс MultiDerived наследуется от Base1 и Base2.
С другой стороны, мы также можем наследовать производные классы. Это называется многоуровневым наследованием. В Python это может быть любой уровень.
В случае многоуровневого наследования функции базового класса и производного класса наследуются новым производным классом.
Ниже приведен пример с соответствующим визуальным эффектом.
class Base: пропустить class Derived1(Base): пропустить class Derived2(Derived1): пропустить
В этом случае,Derived1ИзBaseПроизводный,Derived2ИзDerived1Производный.
Каждый класс в 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,и понять способ вычисления реальных алгоритмов.