logo

Metodeoppløsningsrekkefølge i Python

I denne opplæringen vil vi lære om metodeoppløsningsrekkefølge, som også er kjent som MRO. Det er et viktig konsept for Python-arv.

Metodeoppløsningsrekkefølgen beskriver søkebanen til klassen som Python bruker for å få den riktige metoden i klasser som inneholder multi-arven.

Introduksjon

Som vi vet det, kalles en klasse som blir arvet underklassen eller overordnet klasse, mens klassen som arver er kjent som en barneklasse eller underklasse. I multi-arven kan en klasse bestå av mange funksjoner, så metodeoppløsningsordreteknikken brukes til å søke i rekkefølgen baseklassen utføres i.

Med enkle ord - 'Metoden eller attributtene utforskes i gjeldende klasse, hvis metoden ikke er tilstede i gjeldende klasse, flytter søket til overordnede klasser, og så videre'. Dette er et eksempel på et dybde-først-søk.

Det spiller en viktig rolle i multippel arv hvor den samme metoden kan finnes i de flere superklassene.

For å forstå det på en bedre måte, la oss se hvordan vi kan bruke det.

Eksempel -

 class A: def myname(self): print('I am a class A') class B(A): def myname(self): print('I am a class B') class C(A): def myname(self): print('I am a class C') c = C() print(c.myname()) 

Produksjon:

 I am a class C 

Forklaring -

Det er en multippel arv i koden ovenfor. Vi har definert tre klasse kalt A, B og C, og disse klassene har samme navn metode kalt mitt navn(). Vi opprettet en objektklasse C. Objektet påkalte klasse C, ikke klassen, mens klasse C arvet klasse A-metoden.

Rekkefølgen følges i koden ovenfor er klasse B - > klasse A. Denne teknikken er kjent som MRO (metodeoppløsningsrekkefølge).

hvordan fungerer en datamaskin

La oss forstå et annet eksempel på multippel arv.

Eksempel -

 class A: def myname(self): print(' I am a class A') class B(A): def myname(self): print(' I am a class B') class C(A): def myname(self): print('I am a class C') # classes ordering class D(B, C): pass d = D() d.myname() 

Produksjon:

 I am a class B 

Forklaring -

I koden ovenfor har vi laget en annen D-klasse uten å definere klasseattributter som arvet B- og C-klassen. Da vi påkalte metoden mitt navn(), den går til klasse D og søker etter mitt navn( ) funksjon. Men klasse D har ingen erklæring. Derfor overføres søket til klasse B, og får mitt navn() funksjon, og returnerer resultatet. Søket vil foregå som følger.

 Class D -> Class B -> Class C -> Class A 

Hvis klasse B ikke ville ha en metode, vil den påkalle klasse C-metoden.

java-uttalelse

Her foreslår vi at du fjerner klasse B-metoden og sjekker hva som skjer. Ved å gjøre dette vil du få en ide om hvordan metodeoppløsningen fungerer.

Gammel og ny stilrekkefølge

I den eldre versjonen av Python (2.1), er vi begrenset til å bruke de gamle klassene men Python (2.2 og fortsett), kan vi bruke de nye klassene. Som standard har Python 3 originale (nye) klasser. Den nye stilklassens første forelder arver fra Python-rot 'objekt'-klassen. La oss se følgende eksempel -

Eksempel -

 # Old style class class OldStyleClass: pass # New style class class NewStyleClass(object): pass 

Deklarasjonsstilen for begge klasser er forskjellig. I metodeoppløsningen følger gammeldagsklasser dybden-først fra venstre til høyre algoritmen (DLR), mens nye stilklasser bruker C3-lineariseringsalgoritmen mens de utfører multippel arv.

DLR-algoritme

Python oppretter en liste over klasser mens den implementerer multiple arven mellom klassene. Denne listen brukes til å bestemme hvilken metode som må kalles en påkalles av forekomster.

Vi kan anta å jobbe etter navnet da metodeoppløsning vil søke dybde først, og deretter gå fra venstre til høyre. Nedenfor er eksempelet.

Eksempel -

 class A: pass class B: pass class C(A, B): pass class D(B, A): pass class E(C,D): pass 

Først vil algoritmen søke i instansklassen etter den påkalte metoden. Hvis det ikke blir funnet, går det inn i de første foreldrene, hvis det heller ikke er funnet. Den vil se på forelderen til forelderen. Dette vil fortsette til slutten av arveklassene.

I eksemplet ovenfor vil metodeoppløsningsrekkefølgen være -

 class D -> class B -> class A -> class C -> class A 

Men A kan ikke være tilstede to ganger så -

 class D -> class B -> class A -> class C -> 

Denne algoritmen viser den merkelige oppførselen på den tiden. La oss se eksemplet nedenfor.

røye til streng

Eksempel -

 class A: pass class B: pass class C(A, B): pass class D(B, A): pass class E(C,D): pass 

I følge DLR Algorithm vil rekkefølgen være E, C, D, B, A. Det er utveksling av klassene A og B i klasse C, som er svært tvetydig. Det betyr at algoritmen ikke bevarer monotonisitetsegenskapen.

Samuele Perdoni var den første personen som oppdaget en inkonsekvens mellom MRO-algoritmene.

C3 Lineariseringsalgoritme

C3 Linearization Algorithm er en bedre versjon av DLR-algoritmen fordi den fjerner inkonsekvensen. Denne algoritmen har noen begrensninger som er gitt nedenfor.

  • Barn må gå foran foreldrene sine.
  • Hvis en bestemt klasse arver fra en eller flere klasser, lagres de i den rekkefølgen som er spesifisert i tuppelen til basisklassen.

Regler for C3-lineariseringsalgoritmen

  • Strukturen til metodeoppløsningsrekkefølgen defineres av arvegrafen.
  • Brukeren må besøke superklassen først etter at metodene til de lokale klassene er besøkt.
  • Bevar monotoniteten

Metode for metodeoppløsningsklasse

Python gir to måter å få metodeoppløsningsrekkefølgen til en klasse - __mro__ attributt eller mro() metode. Ved hjelp av disse metodene kan vi vise rekkefølgen på metoden de er løst i.

La oss forstå følgende eksempel.

Eksempel -

 class A: def myname(self): print(' I am a class A') class B(A): def myname(self): print(' I am a class B') class C(A): def myname(self): print('I am a class C') # classes ordering class D(B, C): pass # it prints the lookup order print(D.__mro__) print(C.mro()) 

Produksjon:

 (, , , , ) [, , ] 

Som vi kan se i utgangen ovenfor, får vi rekkefølgen på metodeoppløsningsrekkefølgen. På en slik måte fungerer C3-lineariseringsalgoritmen for multippel arv.