Reden wir über etwas, das ziemlich kompliziert klingt.
Es wird m r o oder Method Resolution Order genannt.
Was bedeutet es?
Wir haben hier ein Beispiel für Sie.
Nehmen wir an, wir haben eine Klasse von A, eine Klasse von B, die von der Klasse von A erbt, tut absolut nichts.
Und dann haben wir auch noch classi, die wieder von A erbt und dann endlich eine Klasse D, dann von B
und C erbt.
Wir haben also zwei Klassen, die absolut nichts tun, und dann eine Klasse A und Klassen, die
das gleiche Klassenobjektattribut haben.
Und ich habe tatsächlich herausgearbeitet, wie diese Beziehung aussieht.
Sie sehen, dass D mehrfach von B und C vererbt wird und B und C von A erben.
Und liege ich falsch oder die Reihenfolge der Methodenauflösung ist eine Regel, die Python befolgt, um zu bestimmen, wann Sie eine Methode ausführen,
die ausgeführt werden soll, wenn Sie eine so komplizierte Vererbungsstruktur haben und Maroš eine Regel ist, die
sagt, hey, mach dies, mach dies und dann TU das.
Und das ist die Methode, die Sie ausführen sollten.
Lassen Sie mich Ihnen zeigen, was ich meine.
Nehmen wir an, ich wollte print d dot num machen.
Was denkst du wird hier passieren?
Lassen Sie mich das aus dem Weg räumen oder auskommentieren.
Wenn ich das durchführe, können Sie erraten, was passieren wird?
Wenn ich klicke, laufe.
Ich bekomme einen.
Haben Sie das erwartet?
Sehen wir uns das einmal an, D erbt von B und C.
Und dann erben diese von mir, also bekommen wir eins, weil das Mark, die Reihenfolge der Methodenauflösung ist,
dass es nicht D, B, A, sondern D, b, c, a geht.
Hmmm, denken wir noch ein bisschen darüber nach, MRO sagt einfach, was zuerst in der Reihe ist,
wenn Dinge zwischen Klassen, Methoden oder Variablen oder Attributen gemeinsam sind, was soll ich auswählen?
Und es gibt tatsächlich eine gute Möglichkeit für uns, dies zu überprüfen, wenn ich MRO mache und es dann so mache.
Ron.
Sehen Sie sich das an, das ist der Auftrag oder der MRO dieser Klasse, er sagt, hey, ich werde zuerst nachsehen,
ob Sie anrufen, sagen wir Punkt net oder Punkt.
Nein, ich werde zuerst den Hauptpunktpunkt überprüfen.
Also werde ich diese Klasse überprüfen.
Dann werde ich Main Dot überprüfen.
Also überprüfe ich B und dann überprüfe ich C.
Und dann überprüfe ich a.
Und schließlich werde ich das Basisklassenobjekt noch einmal überprüfen.
Das haben wir schon gesehen.
Es ist die Basisklasse, von der alle Objekte in Python erben.
Das ist also die Reihenfolge, nach der geprüft wird?
Nein.
Wenn wir all dies bestehen.
Und ich klicke auf Ausführen.
Ich hole noch einen.
D hat kein Attribut, nein, weil es diesen ganzen Weg durchlaufen hat, sogar das Basisobjekt überprüft und nie
gefunden hat.
Wenn ich so etwas wie s t r.
Wenn ich klicke, laufe.
Dies funktioniert, weil es die gesamte Vererbungskette durchläuft und dann zum Basisobjekt gelangt und das
Basisobjekt dies tatsächlich hat, damit es nicht erodiert.
Und ja, Sie können die Dundar-Saite verwenden.
Nun, ich habe hier ein großartiges Beispiel gefunden, um Ihnen zu zeigen, warum Erbschaften verwirrend sein
können und warum Sie Dinge wie MRO vermeiden oder zumindest beachten sollten.
Also kopieren wir diesen Code.
Und lass uns das alles einfach entfernen.
Und wir werden ein kleines Spiel spielen.
Nun diese Syntax.
Sieht so aus, das ist also das Vererbungsmodell von dem, was wir gerade erstellt haben, sieht ziemlich verwirrend aus, nicht wahr?
Also, wenn wir sie hier machen.
Und wir haben die MRO- oder Methodenauflösungsreihenfolge von an überprüft.
Was denkst du, wird die Bestellung hier pausiert und versucht zu erraten, wie die Bestellung aussehen wird?
Redi.
Machen wir sie, Dot Amaro.
Übrigens, eine andere Möglichkeit besteht darin, den Dundar Amaro zu verwenden und diesen auszudrucken.
In Ordnung, überprüfen wir das.
Das erste, was wir haben, ist M. In Ordnung, wir überprüfen ihn und dann überprüfen wir B, wir überprüfen B, in Ordnung.
Und dann überprüfen wir A, also überprüfen wir es hier und dann überprüfen wir X X hier drüben, dann Y.
Dann Z, dann das Klassenobjekt.
Ist das der Grund, warum Sie erraten haben, schauen wir uns den Code an.
Warum diese Bestellung?
Nun, die Reihenfolge liegt an der Art und Weise, wie wir die Parameter übergeben, Sie sehen, B wird vor A und
C übergeben.
Das bedeutet also, dass die MRO-Reihenfolge B, dann A sein wird.
Aber warten Sie, nach BNA, was war das?
Nun, nach B und A haben wir Klasse X, warum kam X vor Z?
Anstatt also zu Z zu gehen, machen wir dies ein bisschen größer, anstatt zu dem zu gehen, was wir für
Z gehalten hätten.
Es geht zu X, dann zu Y, Lindsey, dann zum Objekt.
Dies liegt an dem Algorithmus, den sie für die Durchführung von MRO verwenden, der als Tiefe für eine Suche bezeichnet wird.
Nun, dies würde den Rahmen des Kurses sprengen, aber wie Sie sehen, ist es ziemlich verwirrend.
Und tatsächlich hat Python die MRO-Regeln von denen, die wir zuvor in jüngeren Versionen von Python
hatten, geändert.
Dies ist also ein weiteres dieser Dinge, die aktualisiert wurden.
Aber der Grund, warum ich Ihnen das zeige, ist, dass Sie nie auf das Zeug getestet werden.
Wenn Sie Code schreiben, bei dem die Vererbung so aussieht, meinen Sie, dass Sie schlechten Code schreiben, weil
dies zu kompliziert ist, wir nicht einmal Code innerhalb dieser Klassen geschrieben haben und es
bereits verwirrend ist.
MRO ist also da, um zu definieren, welche Reihenfolge Sie übernehmen werden, und Sie können dies jederzeit mit der MRO-Funktion
oder Dundar überprüfen, aber der Grund, warum ich es hierher gebracht habe, ist nicht nur, Sie zu verwirren.
Der Grund ist, dass es existiert.
Sie sollten Ihren Code jedoch nicht auf diese Weise strukturieren.
Das bedeutet nicht, dass dies nicht in freier Wildbahn passiert.
Ja, das tut es, aber zumindest haben Sie eine Möglichkeit, Ihren Code zu überprüfen und möglicherweise zu debuggen, wenn Sie ein Problem
wie dieses sehen.
Ich werde eine Ressource für Sie über MRO hinterlassen, wenn Sie wirklich neugierig sind und wirklich verstehen möchten,
wie dieser Algorithmus funktioniert und wie diese Reihenfolge tatsächlich bestimmt wird.
Aber die wichtigste Erkenntnis ist, dass Python auf diese Weise bestimmt, wann Sie eine Methode
oder ein Attribut aufrufen.
So werde ich die Erbenhierarchie nachschlagen, gut, wenn Ihr Gehirn wehtut.
Mach dir keine Sorge.
Meiner tut das auch.
Mach eine Pause und wir sehen uns im nächsten Video vorbei.