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

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

Metodo sprendimo tvarka „Python“
Kiekviena „Python“ klasė yra kilusi iš object
klasė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 object
klasė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š MultiDerived
klasės paieška tvarka yra ( MultiDerived
, Base1
, Base2
, object
). Ši tvarka taip pat vadinama MultiDerived
klasė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.

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