В този урок ще научите за множественото наследяване в Python и как да го използвате във вашата програма. Също така ще научите за многостепенното наследяване и реда за разрешаване на метода.
Многократно наследяване на Python
Клас може да бъде извлечен от повече от един основен клас в Python, подобно на C ++. Това се нарича множествено наследяване.
При множествено наследяване характеристиките на всички базови класове се наследяват в производния клас. Синтаксисът за множествено наследяване е подобен на единичното наследяване.
Пример
class Base1: pass class Base2: pass class MultiDerived(Base1, Base2): pass
Тук класът MultiDerived се извлича от класовете Base1 и Base2.
![](https://cdn.wiki-base.com/1428282/python_multiple_inheritance_what_is_it_and_how_to_use_it_.jpg.webp)
Класът MultiDerived се наследява както от класовете Base1, така и от Base2.
Наследяване на много нива на Python
Можем да наследяваме и от производен клас. Това се нарича многостепенно наследяване. Тя може да бъде с всякаква дълбочина в Python.
При многостепенното наследяване характеристиките на базовия клас и производния клас се наследяват в новия производен клас.
Пример със съответна визуализация е даден по-долу.
class Base: pass class Derived1(Base): pass class Derived2(Derived1): pass
Тук класът Derived1 е получен от базовия клас, а класът Derived2 е получен от класа Derived1.
![](https://cdn.wiki-base.com/1428282/python_multiple_inheritance_what_is_it_and_how_to_use_it__2.jpg.webp)
Ред за разрешаване на метод в 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.
![](https://cdn.wiki-base.com/1428282/python_multiple_inheritance_what_is_it_and_how_to_use_it__3.jpg.webp)
# 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.