Viacnásobná dedičnosť Pythonu: Čo to je a ako ju používať?

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.

Viacnásobné dedenie v Pythone

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.

Viacúrovňová dedičnosť v Pythone

Poradie rozlíšenia metód v Pythone

Každá trieda v Pythone je odvodená od objecttriedy. 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 objecttriedy.

 # 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 MultiDerivedtriedy vyhľadávacie objednávka ( MultiDerived, Base1, Base2, object). Toto poradie sa tiež nazýva linearizácia MultiDerivedtriedy 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.

Vizualizácia viacnásobnej dedičnosti v Pythone
 # 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.

Zaujímavé články...