„Python“ daugybinis paveldėjimas: kas tai yra ir kaip jį naudoti?

Šioje pamokoje sužinosite apie kelis „Python“ paveldėjimus ir kaip juos naudoti savo programoje. Taip pat sužinosite apie daugiapakopį paveldėjimą ir metodo sprendimo tvarką.

„Python“ daugybinis paveldėjimas

Klasę galima gauti iš daugiau nei vienos pagrindinės „Python“ klasės, panašios į C ++. Tai vadinama daugkartiniu paveldėjimu.

Daugkartinio paveldėjimo atveju visų bazinių klasių bruožai yra paveldimi į išvestinę klasę. Daugkartinio paveldėjimo sintaksė yra panaši į vieno paveldėjimo.

Pavyzdys

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

Čia „MultiDerived“ klasė yra kilusi iš „Base1“ ir „Base2“ klasių.

Daugkartinis paveldėjimas „Python“

„MultiDerived“ klasė paveldi tiek iš „Base1“, tiek iš „Base2“ klasių.

„Python“ daugiapakopis paveldėjimas

Taip pat galime paveldėti iš išvestinės klasės. Tai vadinama daugiapakopiu paveldėjimu. „Python“ gali būti bet kokio gylio.

Daugiapakopio paveldėjimo atveju pagrindinės klasės ir išvestinės klasės ypatybės yra paveldimos į naują išvestinę klasę.

Toliau pateikiamas atitinkamos vizualizacijos pavyzdys.

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

Čia „Derived1“ klasė yra kilusi iš „Base“ klasės, o „Derived2“ klasė - iš „Derived1“ klasės.

Daugiapakopis paveldėjimas „Python“

Metodo sprendimo tvarka „Python“

Kiekviena „Python“ klasė yra kilusi iš objectklasės. Tai yra pagrindinis „Python“ tipas.

Taigi techniškai visos kitos klasės, tiek įmontuotos, tiek vartotojo apibrėžtos, yra išvestinės klasės, o visi objektai yra objectklasės egzemplioriai .

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

Pagal kelis paveldėjimo scenarijus bet kuris nurodytas atributas ieškomas pirmiausia dabartinėje klasėje. Jei nerandama, paieška tęsiama tėvų klasėse pagal gilumą, kairę ir dešinę, neieškant tos pačios klasės du kartus.

Taigi, pirmiau pateiktame pavyzdyje iš MultiDerivedklasės paieška tvarka yra ( MultiDerived, Base1, Base2, object). Ši tvarka taip pat vadinama MultiDerivedklasės linearizavimu, o taisyklių rinkinys, naudojamas šiai tvarkai surasti, vadinamas „ Method Resolution Order“ (MRO) .

MRO turi užkirsti kelią vietiniam eiliškumui ir monotoniškumui. Tai užtikrina, kad klasė visada pasirodys prieš jos tėvus. Jei tėvai yra keli, tvarka yra tokia pati kaip ir pagrindinių klasių.

Klasės MRO galima žiūrėti kaip į __mro__atributą ar mro()metodą. Pirmasis pateikia du kartus, o antrasis - sąrašą.

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

Čia yra šiek tiek sudėtingesnis daugybinio paveldėjimo pavyzdys ir jo vizualizavimas kartu su MRO.

Daugkartinio paveldėjimo vizualizavimas „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())

Rezultatas

 (,,,,,,)

Norėdami sužinoti faktinį algoritmą, kaip apskaičiuojamas MRO, apsilankykite diskusijoje apie MRO.

Įdomios straipsniai...