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.