Tässä opetusohjelmassa opit monista perinnöistä Pythonissa ja siitä, miten sitä käytetään ohjelmassa. Opit myös monitasoisesta perinnöstä ja menetelmän ratkaisujärjestyksestä.
Pythonin moninkertainen perintö
Luokka voidaan johtaa useammasta kuin yhdestä Pythonin perusluokasta, samanlainen kuin C ++. Tätä kutsutaan moniperinnöksi.
Moniperinnössä kaikkien perusluokkien ominaisuudet peritään johdettuun luokkaan. Useiden perintöjen syntaksi on samanlainen kuin yksi perintö.
Esimerkki
class Base1: pass class Base2: pass class MultiDerived(Base1, Base2): pass
Tässä MultiDerived-luokka on johdettu Base1- ja Base2-luokista.
![](https://cdn.wiki-base.com/1428282/python_multiple_inheritance_what_is_it_and_how_to_use_it_.jpg.webp)
MultiDerived-luokka perii sekä Base1- että Base2-luokan.
Pythonin monitasoinen perintö
Voimme myös periä johdetusta luokasta. Tätä kutsutaan monitasoiseksi perinnöksi. Se voi olla missä tahansa syvyydessä Pythonissa.
Monitasoisessa perinnössä perusluokan ja johdetun luokan ominaisuudet peritään uuteen johdettuun luokkaan.
Alla on esimerkki vastaavalla visualisoinnilla.
class Base: pass class Derived1(Base): pass class Derived2(Derived1): pass
Täällä Derived1-luokka on johdettu Base-luokasta ja Derived2-luokka on johdettu Derived1-luokasta.
![](https://cdn.wiki-base.com/1428282/python_multiple_inheritance_what_is_it_and_how_to_use_it__2.jpg.webp)
Menetelmän ratkaisujärjestys Pythonissa
Jokainen Pythonin luokka on johdettu object
luokasta. Se on Pythonin perustyyppi.
Joten teknisesti kaikki muut luokat, joko sisäänrakennetut tai käyttäjän määrittelemät, ovat johdettuja luokkia ja kaikki objektit ovat object
luokan esiintymiä .
# Output: True print(issubclass(list,object)) # Output: True print(isinstance(5.5,object)) # Output: True print(isinstance("Hello",object))
Useiden perintöjen skenaariossa mitä tahansa määritettyä määritettä etsitään ensin nykyisestä luokasta. Jos hakua ei löydy, etsintä jatkuu vanhempien luokkiin syvyyssuunnassa, vasemmalla ja oikealla tavalla etsimättä samaa luokkaa kahdesti.
Joten, edellä esimerkissä MultiDerived
luokan hakujärjestykseksi on ( MultiDerived
, Base1
, Base2
, object
). Tätä järjestystä kutsutaan myös MultiDerived
luokan linearisoinniksi ja tämän järjestyksen löytämiseen käytettyä sääntöjoukkoa kutsutaan Method Resolution Order (MRO) -menetelmäksi .
MRO: n on estettävä paikallinen etusijajärjestys ja tarjottava myös yksitoikkoisuus. Se varmistaa, että luokka esiintyy aina vanhempiensa edessä. Useiden vanhempien tapauksessa järjestys on sama kuin perusluokkien joukot.
Luokan MRO: ta voidaan tarkastella __mro__
attribuuttina tai mro()
menetelmänä. Ensimmäinen palauttaa kaksinkertaisen, kun taas jälkimmäinen palauttaa luettelon.
>>> MultiDerived.__mro__ (, , , ) >>> MultiDerived.mro() (, , , )
Tässä on hieman monimutkaisempi moniperintöesimerkki ja sen visualisointi yhdessä MRO: n kanssa.
![](https://cdn.wiki-base.com/1428282/python_multiple_inheritance_what_is_it_and_how_to_use_it__3.jpg.webp)
# 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())
Tuotos
(,,,,,,)
Jos haluat tietää varsinaisen algoritmin siitä, kuinka MRO lasketaan, käy Keskustelu MRO: sta.