Vairākkārtējs Python mantojums: kas tas ir un kā to izmantot?

Š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.

Vairākkārtēja mantošana Python

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.

Daudzlīmeņu mantojums Python

Metodes izšķiršanas secība Python

Katra Python klase ir atvasināta no objectklases. 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 objectklases 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ā MultiDerivedklasi meklēšanas rīkojums ir ( MultiDerived, Base1, Base2, object). Šo kārtību sauc arī par MultiDerivedklases 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.

Vairāku mantojumu vizualizēšana 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())

Rezultāts

 (,,,,,,)

Lai uzzinātu faktisko MRO aprēķināšanas algoritmu, apmeklējiet sadaļu Diskusija par MRO.

Interesanti raksti...