Pythoni mitmekordne pärand: mis see on ja kuidas seda kasutada?

Selles õpetuses saate teada Pythoni mitmekordse pärimise kohta ja selle kohta, kuidas seda oma programmis kasutada. Samuti saate teada mitmetasandilise pärimise ja meetodi lahendamise järjekorra kohta.

Pythoni mitmekordne pärand

Klass võib olla tuletatud rohkem kui ühest Pythoni baasklassist, sarnaselt C ++ -ga. Seda nimetatakse mitmekordseks pärimiseks.

Mitmekordse pärimise korral pärandatakse tuletatud klassi kõigi põhiklasside tunnused. Mitme pärandi süntaks sarnaneb ühe pärimisega.

Näide

 class Base1: pass class Base2: pass class MultiDerived(Base1, Base2): pass

Siin on klass MultiDerived tuletatud klassidest Base1 ja Base2.

Mitu pärandit Pythonis

Klass MultiDerived pärib nii Base1 kui ka Base2 klassidest.

Pythoni mitmetasandiline pärand

Pärida võime ka tuletatud klassist. Seda nimetatakse mitmetasandiliseks pärimiseks. See võib olla Pythonis mis tahes sügavusega.

Mitmetasandilise pärimise korral päritakse baasklassi ja tuletatud klassi tunnused uude tuletatud klassi.

Allpool on toodud näide vastava visualiseerimisega.

 class Base: pass class Derived1(Base): pass class Derived2(Derived1): pass

Siin tuletatakse Derived1 klass baasiklassist ja Derived2 klass derived1 klassist.

Mitmetasandiline pärimine Pythonis

Meetodi lahendamise järjekord Pythonis

Iga Pythoni klass on tuletatud objectklassist. See on Pythoni kõige põhitüüp.

Nii et tehniliselt on kõik muud klassid, kas sisseehitatud või kasutaja määratletud, tuletatud klassid ja kõik objektid on objectklassi eksemplarid .

 # Output: True print(issubclass(list,object)) # Output: True print(isinstance(5.5,object)) # Output: True print(isinstance("Hello",object))

Mitme pärimise stsenaariumi korral otsitakse mis tahes määratud atribuuti praeguses klassis esimesena. Kui seda ei leita, jätkatakse otsimist vanemklassidesse sügavalt kõigepealt vasakule-paremale, otsimata samas klassis kaks korda.

Niisiis, eespool näiteks MultiDerivedklassi otsingu et on ( MultiDerived, Base1, Base2, object). Seda järjekorda nimetatakse ka MultiDerivedklassi lineariseerimiseks ja selle järjekorra leidmiseks kasutatavat reeglite kogumit nimetatakse meetodi eraldamise järjekorraks ( Method Resolution Order, MRO) .

MRO peab vältima kohaliku järjestuse järjestamist ja pakkuma ka monotoonsust. See tagab, et klass ilmub alati oma vanemate ette. Mitme vanema puhul on järjestus sama, mis põhiklassi rühmadel.

Klassi MRO-d saab vaadata __mro__atribuudi või mro()meetodina. Esimene tagastab kahese, teine ​​aga loendi.

 >>> MultiDerived.__mro__ (, , , ) >>> MultiDerived.mro() (, , , )

Siin on natuke keerulisem mitmekordse pärimise näide ja selle visualiseerimine koos MRO-ga.

Mitme pärimise visualiseerimine Pythonis
 # 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äljund

 (,,,,,,)

MRO arvutamise tegeliku algoritmi tundmaõppimiseks külastage jaotist Arutelu MRO kohta.

Huvitavad Artiklid...