V tomto kurzu se dozvíte o vícenásobné dědičnosti v Pythonu a o tom, jak ji používat ve vašem programu. Dozvíte se také o víceúrovňové dědičnosti a pořadí rozlišení metody.
Python Multiple Inheritance
Třídu lze v Pythonu odvodit z více než jedné základní třídy, podobně jako v C ++. Tomu se říká vícenásobné dědictví.
Ve vícenásobné dědičnosti se funkce všech základních tříd dědí do odvozené třídy. Syntaxe vícenásobné dědičnosti je podobná jednoduché dědičnosti.
Příklad
class Base1: pass class Base2: pass class MultiDerived(Base1, Base2): pass
Zde je třída MultiDerived odvozena od tříd Base1 a Base2.

Třída MultiDerived dědí z tříd Base1 i Base2.
Víceúrovňová dědičnost Pythonu
Můžeme také dědit z odvozené třídy. Tomu se říká víceúrovňová dědičnost. V Pythonu to může být jakékoli hloubky.
Ve víceúrovňové dědičnosti se funkce základní třídy a odvozené třídy dědí do nové odvozené třídy.
Níže je uveden příklad s odpovídající vizualizací.
class Base: pass class Derived1(Base): pass class Derived2(Derived1): pass
Zde je třída Derived1 odvozena od třídy Base a třída Derived2 je odvozena od třídy Derived1.

Pořadí řešení metod v Pythonu
Každá třída v Pythonu je odvozena od object
třídy. Je to nejzákladnější typ v Pythonu.
Technicky jsou tedy všechny ostatní třídy, ať už vestavěné nebo definované uživatelem, odvozenými třídami a všechny objekty jsou instancemi object
třídy.
# Output: True print(issubclass(list,object)) # Output: True print(isinstance(5.5,object)) # Output: True print(isinstance("Hello",object))
Ve scénáři vícenásobného dědění se nejprve prohledá jakýkoli zadaný atribut v aktuální třídě. Pokud není nalezen, hledání pokračuje do nadřazených tříd hloubkově, zleva doprava bez hledání stejné třídy dvakrát.
Takže ve výše uvedeném příkladu MultiDerived
třídy vyhledávací objednávka ( MultiDerived
, Base1
, Base2
, object
). Toto pořadí se také nazývá linearizace MultiDerived
třídy a sada pravidel používaných k nalezení tohoto pořadí se nazývá Method Resolution Order (MRO) .
MRO musí zabránit uspořádání místních priorit a také zajistit monotónnost. Zajišťuje, aby se třída vždy objevila před rodiči. V případě více rodičů je pořadí stejné jako n-tice základních tříd.
MRO třídy lze zobrazit jako __mro__
atribut nebo mro()
metodu. První vrátí n-tici, zatímco druhá vrátí seznam.
>>> MultiDerived.__mro__ (, , , ) >>> MultiDerived.mro() (, , , )
Zde je trochu složitější příklad vícenásobné dědičnosti a jeho vizualizace 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ýstup
(,,,,,,)
Chcete-li znát skutečný algoritmus výpočtu MRO, navštivte Diskuse o MRO.