logo

Method Resolution Order Python

Ebben az oktatóanyagban megismerjük a módszerfeloldási sorrendet, amelyet MRO-nak is neveznek. Ez a Python öröklődés alapvető fogalma.

A metódusfeloldási sorrend az osztály keresési útvonalát írja le, amely Piton használja, hogy megkapja a megfelelő metódust a többszörös öröklődést tartalmazó osztályokban.

Bevezetés

Mint tudjuk, az öröklődő osztályt alosztálynak vagy szülőosztálynak, míg az öröklődő osztályt gyermekosztálynak vagy alosztálynak nevezzük. A többszörös öröklődésben egy osztály sok függvényből állhat, ezért a metódusfeloldási sorrend technikával keresik az alaposztály végrehajtási sorrendjét.

Egyszerű szavakkal - 'A metódus vagy az attribútumok feltárása az aktuális osztályban történik, ha a metódus nincs jelen az aktuális osztályban, a keresés átkerül a szülő osztályokra, és így tovább'. Ez egy példa a mélységi keresésre.

Alapvető szerepet játszik a többszörös öröklődésben, ahol ugyanaz a metódus megtalálható a több szuperosztályban is.

atoi c

Hogy jobban megértsük, nézzük meg, hogyan használhatjuk fel.

Példa -

 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()) 

Kimenet:

 I am a class C 

Magyarázat -

A fenti kódban többszörös öröklődés található. Három osztályt határoztunk meg A, B és C néven, és ezeknek az osztályoknak ugyanaz a nevű metódusuk van nevem(). Létrehoztunk egy C objektumosztályt. Az objektum a C osztályt hívta meg, nem az osztályt, míg a C osztály az A osztály metódusát örökölte.

prímszám java-ban

A sorrendet a fenti kód követi B osztály - > A osztály. Ezt a technikát MRO-nak (method resolution order) nevezik.

Nézzünk meg egy másik példát a többszörös öröklődésre.

Példa -

 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() 

Kimenet:

 I am a class B 

Magyarázat -

string java összehasonlítása

A fenti kódban létrehoztunk egy másik D osztályt anélkül, hogy olyan osztályattribútumokat határoztunk volna meg, amelyek B és C osztályt örököltek. Amikor megidéztük a módszert nevem(), a D osztályba megy, és megkeresi a nevem( ) funkciót. De a D osztálynak nincs nyilatkozata. Ezért a keresés átkerül a B osztályba, megkapja a nevem() függvényt, és visszaadja az eredményt. A keresés a következőképpen történik.

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

Ha a B osztálynak nem lenne metódusa, akkor a C osztályú metódust fogja meghívni.

Itt azt javasoljuk, hogy távolítsa el a B osztályú metódust, és ellenőrizze, mi történik. Ezzel képet kaphat a módszerfelbontás működéséről.

Régi és új stílusú sorrend

A Python régebbi verziójában (2.1) korlátozzuk a régi osztályok használatát, de Piton (2.2 és folytatás), használhatjuk az új osztályokat. Alapértelmezés szerint a Python 3 eredeti (új) osztályokkal rendelkezik. Az új stílusosztály első szülője a Python gyökér 'objektum' osztályától örökli. Nézzük a következő példát -

Példa -

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

Mindkét osztály deklarációs stílusa eltérő. A metódusfeloldásban a régi típusú osztályok a mélység-első balról jobbra algoritmust (DLR) követik, míg az új stílusosztályok a C3 linearizációs algoritmust használják, miközben többszörös öröklődést hajtanak végre.

DLR algoritmus

A Python létrehozza az osztályok listáját, miközben megvalósítja az osztályok közötti többszörös öröklődést. Ez a lista annak meghatározására szolgál, hogy a példányok melyik metódust hívják meg.

Feltételezhetjük, hogy a neve alapján dolgozunk, mivel a metódus felbontása először a mélységben keres, majd balról jobbra halad. Alább látható a példa.

Példa -

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

Először az algoritmus a példányosztályban megkeresi a meghívott metódust. Ha nem található, akkor az első szülőkhöz kerül, ha szintén nem található. Megvizsgálja a szülő szülőjét. Ez az öröklési osztályok végéig folytatódik.

python programok

A fenti példában a metódusfeloldási sorrend a következő lesz:

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

De A nem lehet kétszer jelen, így

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

Ez az algoritmus az akkori furcsa viselkedést mutatja. Lássuk az alábbi példát.

Példa -

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

A DLR algoritmus szerint a sorrend E, C, D, B, A lesz. A C osztályban az A és B osztályok felcserélése van, ami nagyon kétértelmű. Ez azt jelenti, hogy az algoritmus nem őrzi meg a monotonitási tulajdonságot.

ridhima tiwari

Samuele Perdoni volt az első ember, aki ellentmondást fedezett fel az MRO algoritmusok között.

C3 Linearizációs algoritmus

A C3 Linearization Algorithm a DLR algoritmus jobb változata, mert megszünteti az inkonzisztenciát. Ennek az algoritmusnak van néhány korlátozása, amelyeket alább ismertetünk.

  • A gyerekeknek megelőzniük kell szüleiket.
  • Ha egy adott osztály az egy vagy több osztályból örököl, akkor azok az alaposztály sorában megadott sorrendben kerülnek mentésre.

A C3 linearizációs algoritmus szabályai

  • A metódusfeloldási sorrend szerkezetét az öröklődési gráf határozza meg.
  • A felhasználónak csak a helyi osztályok metódusainak meglátogatása után szabad a szuperosztályt felkeresnie.
  • A monotonitás megőrzése

Method for Method Resolution class

A Python két módszert kínál egy osztály metódusfeloldási sorrendjének lekérésére - __mro__ attribútum ill mro() módszer. Ezen metódusok segítségével meg tudjuk jeleníteni, hogy milyen sorrendben oldják meg őket.

Értsük meg a következő példát.

Példa -

 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()) 

Kimenet:

 (, , , , ) [, , ] 

Ahogy a fenti kimenetben láthatjuk, megkapjuk a metódus felbontási sorrendjének sorrendjét. Ilyen módon a C3 linearizációs algoritmus többszörös öröklődésre is működik.