V tej vadnici boste izvedeli več o dedovanju v Pythonu in kako ga uporabljati v svojem programu. Spoznali boste tudi večstopenjsko dedovanje in vrstni red ločljivosti metode.
Python večkratno dedovanje
Razred lahko izpeljemo iz več kot enega osnovnega razreda v Pythonu, podobno kot C ++. To se imenuje večkratno dedovanje.
Pri večkratnem dedovanju se lastnosti vseh osnovnih razredov podedujejo v izpeljani razred. Sintaksa za večkratno dedovanje je podobna dedovanju z enim samim.
Primer
class Base1: pass class Base2: pass class MultiDerived(Base1, Base2): pass
Tu je razred MultiDerived izpeljan iz razredov Base1 in Base2.

Razred MultiDerived podeduje oba razreda Base1 in Base2.
Dedovanje Python na več ravneh
Podedujemo lahko tudi iz izpeljanega razreda. To se imenuje večstopenjsko dedovanje. V Pythonu je lahko poljubne globine.
Pri večstopenjskem dedovanju se lastnosti osnovnega razreda in izpeljanega razreda podedujejo v novi izvedeni razred.
Primer z ustrezno vizualizacijo je podan spodaj.
class Base: pass class Derived1(Base): pass class Derived2(Derived1): pass
Tu je razred Derived1 izpeljan iz razreda Base, razred Derived2 pa iz razreda Derived1.

Vrstni red ločljivosti metode v Pythonu
Vsak razred v Pythonu izhaja iz object
razreda. To je najbolj osnovna vrsta v Pythonu.
Torej tehnično so vsi drugi razredi, bodisi vgrajeni bodisi uporabniško definirani, izpeljani razredi in vsi predmeti so primerki object
razreda.
# Output: True print(issubclass(list,object)) # Output: True print(isinstance(5.5,object)) # Output: True print(isinstance("Hello",object))
V scenariju večkratnega dedovanja se v trenutnem razredu najprej išče kateri koli določen atribut. Če ga ne najdete, se iskanje nadaljuje v nadrejene razrede po globini najprej, levo-desno, ne da bi dvakrat iskali isti razred.
Torej, v zgornjem primeru MultiDerived
razreda je vrstni red iskanje ( MultiDerived
, Base1
, Base2
, object
). Ta vrstni red se imenuje tudi linearizacija MultiDerived
razreda, nabor pravil, ki se uporablja za iskanje tega reda, pa Metod Resolution Order (MRO) .
MRO mora preprečiti lokalno urejanje prednosti in zagotoviti monotonost. Zagotavlja, da se razred vedno pojavi pred starši. Pri več starših je vrstni red enak kot nabor osnovnih razredov.
MRO razreda je mogoče obravnavati kot __mro__
atribut ali mro()
metodo. Prvi vrne korito, drugi pa seznam.
>>> MultiDerived.__mro__ (, , , ) >>> MultiDerived.mro() (, , , )
Tu je malo bolj zapleten primer večkratnega dedovanja in njegova vizualizacija skupaj z 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())
Izhod
(,,,,,,)
Če želite vedeti dejanski algoritem, kako se izračuna MRO, obiščite razpravo o MRO.