Šajā apmācībā jūs uzzināsit par vairāku mantošanu Python un kā to izmantot savā programmā. Jūs uzzināsiet arī par daudzlīmeņu mantojumu un metodes izšķiršanas kārtību.
Python vairākkārtēja mantošana
Klase var būt atvasināta no vairākām Python bāzes klasēm, līdzīga C ++. To sauc par vairākkārtēju mantošanu.
Vairākkārtējā mantojumā visu pamatklases pazīmes tiek pārmantotas atvasinātajā klasē. Vairāku mantojumu sintakse ir līdzīga vienreizējai mantošanai.
Piemērs
class Base1: pass class Base2: pass class MultiDerived(Base1, Base2): pass
Šeit MultiDerived klase tiek atvasināta no Base1 un Base2 klasēm.

MultiDerived klase pārmanto gan Base1, gan Base2 klases.
Python daudzlīmeņu mantojums
Mēs varam mantot arī no atvasinātas klases. To sauc par daudzlīmeņu mantojumu. Pitonā tas var būt jebkura dziļuma.
Daudzlīmeņu mantojumā pamatklases un atvasinātās klases pazīmes tiek pārmantotas jaunajā atvasinātajā klasē.
Zemāk ir sniegts piemērs ar atbilstošu vizualizāciju.
class Base: pass class Derived1(Base): pass class Derived2(Derived1): pass
Šeit Derived1 klase ir atvasināta no bāzes klases, un Derived2 klase ir atvasināta no Derived1 klases.

Metodes izšķiršanas secība Python
Katra Python klase ir atvasināta no object
klases. Tas ir Python pamata veids.
Tātad tehniski visas pārējās klases, iebūvētas vai lietotāja definētas, ir atvasinātas klases, un visi objekti ir object
klases eksemplāri .
# Output: True print(issubclass(list,object)) # Output: True print(isinstance(5.5,object)) # Output: True print(isinstance("Hello",object))
Vairāku mantojumu scenārijā jebkurš norādītais atribūts tiek meklēts vispirms pašreizējā klasē. Ja tas nav atrasts, meklēšana turpinās vecāku klasēs pēc dziļuma, kreisās un labās puses, divreiz nemeklējot to pašu klasi.
Tātad, iepriekš piemērā MultiDerived
klasi meklēšanas rīkojums ir ( MultiDerived
, Base1
, Base2
, object
). Šo kārtību sauc arī par MultiDerived
klases linearizāciju, un noteikumu kopumu, kas izmantots šīs kārtības atrašanai, sauc par Metodes izšķiršanas kārtību (MRO) .
MRO jānovērš vietējās prioritātes pasūtīšana un jānodrošina arī monotonitāte. Tas nodrošina, ka klase vienmēr parādās vecāku priekšā. Vairāku vecāku gadījumā kārtība ir tāda pati kā pamatklases.
Klases MRO var apskatīt kā __mro__
atribūtu vai mro()
metodi. Pirmais atgriež dubultu, bet otrais - sarakstu.
>>> MultiDerived.__mro__ (, , , ) >>> MultiDerived.mro() (, , , )
Šeit ir nedaudz sarežģītāks vairāku mantojumu piemērs un tā vizualizācija kopā ar MRO.

# 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())
Rezultāts
(,,,,,,)
Lai uzzinātu faktisko MRO aprēķināšanas algoritmu, apmeklējiet sadaļu Diskusija par MRO.