Многократно наследяване на 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.

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