V tomto výučbe sa dozviete o viacnásobnom dedení v Pythone a o tom, ako ho používať vo vašom programe. Dozviete sa tiež o viacúrovňovom dedení a poradí rozlíšenia metód.
Viacnásobné dedičstvo v Pythone
Triedu možno odvodiť z viac ako jednej základnej triedy v Pythone, podobne ako v C ++. Toto sa nazýva viacnásobné dedičstvo.
Pri viacnásobnom dedení sa vlastnosti všetkých základných tried dedia do odvodenej triedy. Syntax viacnásobného dedičstva je podobná jednoduchému dedičstvu.
Príklad
class Base1: pass class Base2: pass class MultiDerived(Base1, Base2): pass
Trieda MultiDerived je tu odvodená od tried Base1 a Base2.

Trieda MultiDerived dedí z tried Base1 aj Base2.
Viacúrovňová dedičnosť Pythonu
Môžeme dediť aj z odvodenej triedy. Toto sa nazýva viacúrovňové dedičstvo. V Pythone môže mať akúkoľvek hĺbku.
Vo viacúrovňovom dedení sa funkcie základnej triedy a odvodenej triedy dedia do novej odvodenej triedy.
Nižšie je uvedený príklad so zodpovedajúcou vizualizáciou.
class Base: pass class Derived1(Base): pass class Derived2(Derived1): pass
Tu je trieda Derived1 odvodená od triedy Base a trieda Derived2 je odvodená od triedy Derived1.

Poradie rozlíšenia metód v Pythone
Každá trieda v Pythone je odvodená od object
triedy. Je to najzákladnejší typ v Pythone.
Technicky teda všetky ostatné triedy, buď zabudované, alebo definované používateľom, sú odvodenými triedami a všetky objekty sú inštanciami object
triedy.
# Output: True print(issubclass(list,object)) # Output: True print(isinstance(5.5,object)) # Output: True print(isinstance("Hello",object))
V scenári viacnásobného dedičstva sa akýkoľvek zadaný atribút prehľadáva najskôr v aktuálnej triede. Ak sa nenájde, hľadanie pokračuje do nadradených tried hĺbkovo, zľava-pravo bez toho, aby sa dvakrát hľadala rovnaká trieda.
Takže vo vyššie uvedenom príklade MultiDerived
triedy vyhľadávacie objednávka ( MultiDerived
, Base1
, Base2
, object
). Toto poradie sa tiež nazýva linearizácia MultiDerived
triedy a množina pravidiel použitých na nájdenie tohto poradia sa nazýva Method Resolution Order (MRO) .
MRO musí zabrániť usporiadaniu miestnych predností a tiež zabezpečiť monotónnosť. Zaisťuje, aby sa trieda vždy objavila pred rodičmi. V prípade viacerých rodičov je poradie rovnaké ako n-tice základných tried.
MRO triedy možno považovať za __mro__
atribút alebo mro()
metódu. Prvý vráti n-ticu, zatiaľ čo druhý vráti zoznam.
>>> MultiDerived.__mro__ (, , , ) >>> MultiDerived.mro() (, , , )
Tu je trochu zložitejší príklad viacnásobného dedičstva a jeho vizualizácia spolu s 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())
Výkon
(,,,,,,)
Aktuálny algoritmus výpočtu MRO nájdete v diskusii o MRO.