Dziedziczenie wielokrotne w Pythonie: co to jest i jak z niego korzystać?

W tym samouczku dowiesz się o dziedziczeniu wielokrotnym w Pythonie i jak go używać w swoim programie. Dowiesz się również o dziedziczeniu wielopoziomowym i kolejności rozwiązywania metod.

Dziedziczenie wielokrotne w Pythonie

Klasa może pochodzić z więcej niż jednej klasy bazowej w Pythonie, podobnie jak w C ++. Nazywa się to dziedziczeniem wielokrotnym.

W przypadku dziedziczenia wielokrotnego funkcje wszystkich klas podstawowych są dziedziczone do klasy pochodnej. Składnia dziedziczenia wielokrotnego jest podobna do dziedziczenia pojedynczego.

Przykład

 class Base1: pass class Base2: pass class MultiDerived(Base1, Base2): pass

W tym przypadku klasa MultiDerived pochodzi z klas Base1 i Base2.

Dziedziczenie wielokrotne w Pythonie

Klasa MultiDerived dziedziczy po obu klasach Base1 i Base2.

Dziedziczenie wielopoziomowe w Pythonie

Możemy również dziedziczyć z klasy pochodnej. Nazywa się to dziedziczeniem wielopoziomowym. W Pythonie może mieć dowolną głębokość.

W przypadku dziedziczenia wielopoziomowego funkcje klasy bazowej i klasy pochodnej są dziedziczone do nowej klasy pochodnej.

Przykład z odpowiednią wizualizacją podano poniżej.

 class Base: pass class Derived1(Base): pass class Derived2(Derived1): pass

W tym przypadku klasa Derived1 jest pochodną klasy Base, a klasa Derived2 jest pochodną klasy Derived1.

Dziedziczenie wielopoziomowe w Pythonie

Kolejność rozwiązywania metod w Pythonie

Każda klasa w Pythonie jest pochodną tej objectklasy. Jest to najbardziej podstawowy typ w Pythonie.

Z technicznego punktu widzenia wszystkie inne klasy, wbudowane lub zdefiniowane przez użytkownika, są klasami pochodnymi, a wszystkie obiekty są instancjami objectklasy.

 # Output: True print(issubclass(list,object)) # Output: True print(isinstance(5.5,object)) # Output: True print(isinstance("Hello",object))

W scenariuszu wielokrotnego dziedziczenia każdy określony atrybut jest najpierw przeszukiwany w bieżącej klasie. Jeśli nie zostanie znaleziony, przeszukiwanie jest kontynuowane w klasach nadrzędnych w sposób głęboki, od lewej do prawej bez dwukrotnego przeszukiwania tej samej klasy.

Tak więc, w powyższym przykładzie MultiDerivedklasy kolejność wyszukiwania jest ( MultiDerived, Base1, Base2, object). Ta kolejność jest również nazywana linearyzacją MultiDerivedklasy, a zestaw reguł używanych do znalezienia tej kolejności nazywa się Method Resolution Order (MRO) .

MRO musi zapobiegać lokalnemu porządkowaniu pierwszeństwa, a także zapewniać monotonię. Zapewnia, że ​​klasa zawsze pojawia się przed swoimi rodzicami. W przypadku wielu rodziców kolejność jest taka sama, jak w przypadku krotek klas bazowych.

MRO klasy można postrzegać jako __mro__atrybut lub mro()metodę. Pierwsza zwraca krotkę, a druga listę.

 >>> MultiDerived.__mro__ (, , , ) >>> MultiDerived.mro() (, , , )

Oto trochę bardziej złożony przykład wielokrotnego dziedziczenia i jego wizualizacja wraz z MRO.

Wizualizacja wielokrotnego dziedziczenia w Pythonie
 # 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())

Wynik

 (,,,,,,)

Aby poznać rzeczywisty algorytm obliczania MRO, odwiedź Dyskusję na temat MRO.

Interesujące artykuły...