Laten we het hebben over iets dat nogal ingewikkeld klinkt.
Het heet m r o of Method Resolution Order.
Wat betekent het?
We hebben hier een voorbeeld voor je.
Laten we zeggen dat we een klasse van A hebben, klasse van B die erft van klasse van A doet absoluut niets.
En dan hebben we ook classi die weer erft van A en dan tenslotte een klasse D, dan erft van
B en C.
We hebben dus twee klassen die absoluut niets doen, en dan een klasse en klassen
die hetzelfde class-objectattribuut hebben.
En ik heb eigenlijk uitgetekend hoe deze relatie eruit ziet.
Je ziet dat D meerdere overervingen heeft van B en C en B en C erven van A.
En heb ik het mis of is de volgorde van de methoderesolutie een regel die Python volgt om te bepalen wanneer je een methode
uitvoert die wil worden uitgevoerd, wanneer je zo'n gecompliceerde overervingsstructuur hebt en Maroš een regel is die
zegt, hey, doe dit, doe dit en dan doe dat.
En dat is de methode die u moet uitvoeren.
Laat me je laten zien wat ik bedoel.
Laten we zeggen dat ik print d dot num wilde doen.
Wat denk je dat hier gaat gebeuren?
Laat me dit uit de weg ruimen of er commentaar op geven.
Als ik dit doe, kun je dan raden wat er gaat gebeuren?
Als ik klik, ren dan weg.
Ik krijg er een.
Is dat wat je verwachtte?
Laten we dit even doornemen, D erft van B en C.
En die erven dan van mij, dus we krijgen er een, omdat het merg, de methode-resolutievolgorde is dat het
niet D, B, A gaat, maar in plaats daarvan D, b, c, a.
Hmmm, laten we hier nog even over nadenken, MRO zegt gewoon wat het eerste is als
dingen gemeenschappelijk zijn tussen klassen, methoden of variabelen of attributen, wat moet ik kiezen?
En er is eigenlijk een goede manier voor ons om dit te controleren als ik MRO doe en het dan zo uit te voeren.
Ron.
Kijk eens aan, dit is de volgorde of de MRO van deze klas, er staat, hey, ik ga eerst kijken of
je callt, laten we zeggen dot net of dot.
Nee, ik ga eerst de hoofdstip controleren.
Dus ik ga deze klas controleren.
Dan ga ik Main Dot be checken.
Dus ik ga B controleren en dan ga ik C controleren.
En dan ga ik a controleren.
En tot slot ga ik het basisklasse-object opnieuw controleren.
Dat hebben we eerder gezien.
Het is de basisklasse waarvan alle objecten in Python erven.
Dus dat is de volgorde waarop het controleert?
Nee.
Als we deze allemaal passeren.
En ik klik op uitvoeren.
Ik haal er nog een.
D heeft geen attribuut, nee, omdat het dit hele pad heeft doorlopen, zelfs het basisobject heeft gecontroleerd en er nooit een
heeft gevonden.
Als ik iets deed als s t r.
Als ik klik, ren dan weg.
Dit werkt omdat het helemaal door de overervingsketen gaat en dan bij het basisobject komt en
het basisobject heeft dit ook, zodat het niet erodeert.
En ja, je kunt de Dundar-string gebruiken.
Ik heb hier een goed voorbeeld gevonden om u te laten zien waarom erfenissen verwarrend kunnen zijn en waarom
u zaken als MRO wilt vermijden of op zijn minst bewust van wilt zijn.
Dus laten we deze code kopiëren.
En laten we dit allemaal maar verwijderen.
En we gaan een spelletje doen.
Nu, deze syntaxis.
Ziet er zo uit, dus dit is het overervingsmodel van wat we zojuist hebben gemaakt, ziet er nogal verwarrend uit, niet?
Dus als we ze hier doen.
En we hebben de MRO- of methoderesolutievolgorde van een gecontroleerd.
Wat denk je dat de bestelling zal worden gepauzeerd, de video hier en probeer te raden wat de bestelling zal zijn?
Redi.
Laten we ze doen, Dot Amaro.
En trouwens, een andere manier om dit te doen is om de Dundar Amaro te gebruiken en dit uit te printen.
Oké, laten we dit controleren.
Dus het eerste wat we hebben is M. Oké, we checken hem en dan checken we B, we checken B, oké.
En dan checken we A, dus we checken het hier en dan checken we X X hier, dan Y.
Dan Z, dan het klasseobject.
Is dat de reden waarom je het geraden hebt, laten we eens naar de code kijken.
Waarom deze bestelling?
Nou, de volgorde is vanwege de manier waarop we de parameters doorgeven, je ziet dat B wordt doorgegeven voor A
en C.
Dus dat betekent dat de volgorde van MRO B wordt, dan A.
Maar wacht even, na BNA, wat was dat?
Nou, na B en A hebben we Klasse X, waarom kwam X voor Z?
Dus in plaats van naar Z te gaan, laten we dit een beetje groter maken, in plaats van te gaan naar wat we dachten
dat Z zou zijn.
Het gaat naar X, dan Y, Lindsey, dan het object.
Dit komt door het algoritme dat ze gebruiken voor het doen van MRO, dat diepte voor een zoekopdracht wordt genoemd.
Dit valt buiten het bestek van de cursus, maar zoals je kunt zien, is het nogal verwarrend.
En in feite heeft Python de MRO-regels veranderd van wat we eerder hadden in jongere versies
van Python.
Dit is dus weer een van die dingen die zijn bijgewerkt.
Maar de reden dat ik je dit laat zien, is omdat je nooit op het spul getest wordt.
Als je code schrijft waarbij de overerving er als volgt uitziet, beweer ik dat je slechte code schrijft
omdat dit te ingewikkeld is, we hebben zelfs geen code geschreven binnen deze klassen, en het
is al verwarrend.
Dus MRO is er als een manier om te bepalen welke volgorde je gaat overnemen en je kunt altijd de MRO-functie of Dundar gebruiken
om dit te controleren, maar de reden dat ik het hier bracht, is niet alleen om je in verwarring te brengen.
De reden is dat het bestaat.
U moet uw code echter niet op deze manier structureren.
Dit betekent niet dat dit niet in het wild gebeurt.
Ja, dat doet het, maar je hebt tenminste een manier om je code te controleren en misschien te debuggen als je een probleem
als dit ziet.
Ik zal een bron voor je achterlaten over MRO als je echt nieuwsgierig bent en je echt wilt begrijpen
hoe dit algoritme werkt en hoe deze volgorde feitelijk wordt bepaald.
Maar het belangrijkste is dat dit de manier is waarop Python werkt om te bepalen, hé, wanneer je
een methode of een attribuut aanroept.
Dit is hoe ik de hiërarchie van erfenissen ga opzoeken, oké, als je hersens pijn doen.
Maak je geen zorgen.
Die van mij ook.
Neem een pauze en ik zie je in de volgende video door.