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.