Parlons de quelque chose qui semble assez compliqué.
Cela s'appelle m r o ou Method Resolution Order.
Qu'est-ce que ça veut dire?
Nous aurons un exemple ici pour vous.
Disons que nous avons une classe de A, une classe de B qui hérite de la classe de A ne fait absolument rien.
Et puis on a aussi des classi qui héritent à nouveau de A et puis enfin une classe D, puis hérite de
B et C.
Nous avons donc deux classes qui ne font absolument rien, puis une classe et des classes qui ont le
même attribut d'objet de classe.
Et j'ai en fait dessiné à quoi ressemble cette relation.
Vous voyez que D a un héritage multiple de B et C et que B et C héritent de A.
Et est-ce que je me trompe ou l'ordre de résolution de la méthode est une règle que Python suit pour déterminer quand vous exécutez une
méthode que vous voulez exécuter, quand vous avez une structure d'héritage si compliquée et Maroš est une règle
qui dit, hé, fais ceci, fais ceci et ensuite fais ça.
Et c'est la méthode que vous devez exécuter.
Laissez-moi vous montrer ce que je veux dire.
Disons que je voulais faire print d dot num.
Que pensez-vous qu'il va se passer ici?
Permettez-moi de mettre cela de côté ou de commenter cela.
Si je lance ceci, pouvez-vous deviner ce qui va se passer ?
Si je clique, cours.
J'en reçois un.
C'est ce que vous attendiez ?
Regardons à travers cela, D hérite de B et C.
Et puis ceux-ci héritent de moi, donc nous en obtenons un, parce que la moelle, l'ordre de résolution de la méthode est que
ça ne va pas D, B, A, à la place ça va D, b, c, a.
Hmmm, réfléchissons un peu plus à cela, MRO dit simplement ce qui est en premier si les choses
sont communes entre les classes, les méthodes ou les variables ou les attributs, que dois-je choisir ?
Et il y a en fait un bon moyen pour nous de vérifier cela si je fais du MRO et que je l'exécute ensuite comme ça.
Ron.
Regardez ça, c'est l'ordre ou le MRO de cette classe, ça dit, hé, je vais vérifier d'abord si
vous appelez, disons point net ou point.
Non, je vais d'abord vérifier le point principal.
Je vais donc vérifier cette classe.
Ensuite, je vais vérifier Main Dot be.
Je vais donc vérifier B et ensuite je vais vérifier C.
Et puis je vais vérifier a.
Et puis enfin, je vais vérifier à nouveau l'objet de la classe de base.
Nous avons déjà vu cela.
C'est la classe de base dont tous les objets en Python héritent.
C'est donc l'ordre qu'il vérifie ?
Non.
Si nous passons tout cela.
Et je clique sur exécuter.
J'en prendrai un autre.
D n'a pas d'attribut, non, car il a parcouru tout ce chemin, a même vérifié l'objet de base et n'en a
jamais trouvé.
Si je faisais quelque chose comme s t r.
Si je clique, cours.
Cela fonctionne car il va tout au long de la chaîne d'héritage, puis atteint l'objet de base et l'objet
de base a en fait ceci afin qu'il ne s'érode pas.
Et oui, vous pouvez utiliser la chaîne Dundar.
Maintenant, j'ai trouvé un excellent exemple ici pour vous montrer pourquoi les héritages peuvent être déroutants et pourquoi des
choses comme le MRO que vous voudriez peut-être éviter ou au moins être conscientes.
Alors copions ce code.
Et supprimons simplement tout cela.
Et nous allons jouer à un petit jeu.
Maintenant, cette syntaxe.
Cela ressemble à ceci, donc c'est le modèle d'héritage de ce que nous venons de créer semble assez déroutant, n'est-ce pas ?
Donc si nous les faisons ici.
Et nous avons vérifié l'ordre de résolution de MRO ou de méthode d'un.
Que pensez-vous que la commande va mettre la vidéo en pause ici et essayez de deviner quelle sera la commande ?
Redi.
Faisons-les, Dot Amaro.
Et au fait, une autre façon de le faire est d'utiliser le Dundar Amaro et d'imprimer ceci.
Très bien, vérifions ça.
Donc la première chose que nous avons est M. Très bien, nous le vérifions et puis nous vérifions B, nous vérifions B, d'accord.
Et puis nous vérifions A, donc nous le vérifions ici, puis nous vérifions X X ici, puis Y.
Puis Z, puis l'objet de classe.
Est-ce pour cela que vous avez deviné, regardons le code.
Pourquoi cette commande ?
Eh bien, l'ordre est dû à la façon dont nous passons les paramètres, vous voyez que B est passé avant A
et C.
Cela signifie donc que l'ordre de MRO sera B, puis A.
Mais attendez, après BNA, c'était quoi ça ?
Eh bien, après B et A, nous avons la classe X, pourquoi X est-il venu avant Z ?
Donc, au lieu d'aller à Z, agrandissons un peu cela, au lieu d'aller à ce que nous aurions
pensé être Z.
Il va à X, puis Y, Lindsey, puis l'objet.
Cela est dû à l'algorithme qu'ils utilisent pour effectuer le MRO, appelé profondeur pour une recherche.
Maintenant, cela dépasse le cadre du cours, mais comme vous pouvez le voir, c'est un peu déroutant.
Et en fait, Python a en fait changé les règles MRO par rapport à ce que nous avions auparavant dans les versions plus
jeunes de Python.
C'est donc une autre de ces choses qui a été mise à jour.
Mais la raison pour laquelle je vous montre ça, c'est parce que vous n'allez jamais vous faire tester sur ce truc.
Si vous écrivez du code où l'héritage ressemble à ceci, je soutiens que vous écrivez du mauvais code parce
que c'est trop compliqué, nous n'avons même pas écrit de code à l'intérieur de ces classes, et
c'est déjà déroutant.
Le MRO est donc là pour définir l'ordre dans lequel vous allez hériter et vous pouvez toujours utiliser la fonction MRO ou Dundar
pour le vérifier, mais la raison pour laquelle je l'ai apporté ici n'est pas seulement d'essayer de vous embrouiller.
La raison en est qu'il existe.
Cependant, vous ne devez pas structurer votre code de cette manière.
Cela ne veut pas dire que cela ne se produit pas dans la nature.
Oui, c'est le cas, mais au moins vous avez un moyen de vérifier et peut-être de déboguer votre code lorsque vous rencontrez un
problème comme celui-ci.
Je vous laisserai une ressource sur le MRO si vous êtes vraiment curieux et que vous voulez vraiment comprendre
comment fonctionne cet algorithme et comment cet ordre est réellement déterminé.
Mais la clé à retenir est que c'est la façon dont Python fonctionne pour déterminer, hé, lorsque vous
appelez une méthode ou un attribut.
C'est comme ça que je vais chercher la hiérarchie des héritages, d'accord, si tu as mal au cerveau.
Ne t'inquiète pas.
Le mien aussi.
Faites une pause et je vous verrai dans la prochaine vidéo par.