Pythonin moniperintö: mikä se on ja miten sitä käytetään?

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.

Moninkertainen perintö Pythonissa

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.

Monitasoinen perintö Pythonissa

Menetelmän ratkaisujärjestys Pythonissa

Jokainen Pythonin luokka on johdettu objectluokasta. 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 objectluokan 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ä MultiDerivedluokan hakujärjestykseksi on ( MultiDerived, Base1, Base2, object). Tätä järjestystä kutsutaan myös MultiDerivedluokan 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.

Useiden perintöjen visualisointi Pythonissa
 # 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.

Mielenkiintoisia artikkeleita...