U ovom vodiču naučit ćete višestruko nasljeđivanje u Pythonu i kako ga koristiti u svom programu. Također ćete naučiti o nasljeđivanju na više razina i redoslijedu razlučivanja metode.
Python višestruko nasljeđivanje
Klasa se može izvesti iz više od jedne osnovne klase u Pythonu, slično C ++. To se naziva višestruko nasljeđivanje.
U višestrukom nasljeđivanju, značajke svih osnovnih klasa nasljeđuju se u izvedenu klasu. Sintaksa višestrukog nasljeđivanja slična je pojedinačnom nasljeđivanju.
Primjer
class Base1: pass class Base2: pass class MultiDerived(Base1, Base2): pass
Ovdje je klasa MultiDerived izvedena iz klasa Base1 i Base2.
![](https://cdn.wiki-base.com/1428282/python_multiple_inheritance_what_is_it_and_how_to_use_it_.jpg.webp)
Klasa MultiDerived nasljeđuje i klase Base1 i Base2.
Python višerazinsko nasljeđivanje
Također možemo naslijediti iz izvedene klase. To se naziva višerazinsko nasljeđivanje. U Pythonu može biti bilo koje dubine.
U višerazinskom nasljeđivanju, značajke osnovne klase i izvedene klase nasljeđuju se u novu izvedenu klasu.
Primjer s odgovarajućom vizualizacijom dan je u nastavku.
class Base: pass class Derived1(Base): pass class Derived2(Derived1): pass
Ovdje je klasa Derived1 izvedena iz klase Base, a klasa Derived2 izvedena je iz klase Derived1.
![](https://cdn.wiki-base.com/1428282/python_multiple_inheritance_what_is_it_and_how_to_use_it__2.jpg.webp)
Redoslijed rješavanja metode u Pythonu
Svaka klasa u Pythonu izvedena je iz object
klase. To je najosnovniji tip u Pythonu.
Dakle, tehnički su sve ostale klase, bilo ugrađene ili korisnički definirane, izvedene klase i svi su objekti instance object
klase.
# Output: True print(issubclass(list,object)) # Output: True print(isinstance(5.5,object)) # Output: True print(isinstance("Hello",object))
U scenariju višestrukog nasljeđivanja, bilo koji navedeni atribut traži se prvo u trenutnoj klasi. Ako se ne pronađe, pretraživanje se nastavlja u matične razrede po dubini, lijevo-desno, a da se dva puta ne traži ista klasa.
Dakle, u gornjem primjeru MultiDerived
klasa potraga nalog ( MultiDerived
, Base1
, Base2
, object
). Ovaj se poredak naziva i linearizacijom MultiDerived
klase, a skup pravila korištenih za njegovo pronalaženje naziva se Method Resolution Order (MRO) .
OSP mora spriječiti naručivanje lokalnog prioriteta i također osigurati monotonost. Osigurava da se razred uvijek pojavi pred roditeljima. U slučaju više roditelja, redoslijed je isti kao nizovi osnovnih klasa.
MRO klase može se promatrati kao __mro__
atribut ili mro()
metoda. Prvi vraća tuple dok drugi vraća popis.
>>> MultiDerived.__mro__ (, , , ) >>> MultiDerived.mro() (, , , )
Evo malo složenijeg primjera višestrukog nasljeđivanja i njegove vizualizacije uz 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())
Izlaz
(,,,,,,,)
Da biste znali stvarni algoritam kako se izračunava MRO, posjetite Rasprava o MRO.