Hablemos de algo que suena bastante complicado.
Se llama m r o o orden de resolución de método.
¿Qué significa?
Tendremos un ejemplo aquí.
Digamos que tenemos una clase de A, la clase B que hereda de la clase A no hace absolutamente nada.
Y luego también tenemos classi que hereda nuevamente de A y finalmente una clase D, luego hereda de
B y C.
Entonces tenemos dos clases que no hacen absolutamente nada, y luego una clase y clases que tienen el mismo
atributo de objeto de clase.
Y de hecho he sacado a relucir cómo se ve esta relación.
Verá que D tiene herencia múltiple de B y C y B y C heredan de A.
Y estoy equivocado o el orden de resolución del método es una regla que Python sigue para determinar cuándo ejecuta un método que
desea ejecutar, cuando tiene una estructura de herencia tan complicada y Maroš es una regla que dice,
oye, haz esto, haz esto y luego Haz eso.
Y ese es el método que debes ejecutar.
Déjame mostrarte lo que quiero decir.
Digamos que quería hacer print d dot num.
¿Qué crees que pasará aquí?
Permítanme sacar esto del camino o comentarlo.
Si ejecuto esto, ¿puedes adivinar qué va a pasar?
Si hago clic, corre.
Yo consigo uno.
¿Es eso lo que esperabas?
Veamos esto, D hereda de B y C.
Y luego esos heredan de mí, así que obtenemos uno, porque la médula, el orden de resolución del método es
que no va D, B, A, sino que va D, b, c, a.
Hmmm, pensemos en esto un poco más, MRO simplemente dice qué es lo primero en la línea
si las cosas son comunes entre clases, métodos o variables o atributos, ¿qué debo elegir?
Y en realidad hay una buena manera de verificar esto si hago MRO y luego lo ejecuto así.
Ron.
Mire eso, este es el orden o el MRO de esta clase, dice, oye, voy a verificar primero
si llamas, digamos dot net o dot.
No, primero voy a comprobar el punto principal.
Entonces voy a revisar esta clase.
Entonces voy a comprobar que Main Dot sea.
Así que voy a comprobar B y luego voy a comprobar C.
Y luego voy a comprobar a.
Y luego, finalmente, voy a verificar el objeto de la clase base nuevamente.
Lo hemos visto antes.
Es la clase base de la que heredan todos los objetos en Python.
¿Entonces ese es el orden que busca?
No.
Si pasamos todos estos.
Y hago clic en ejecutar.
Conseguiré otro.
D no tiene ningún atributo, no, porque recorrió todo este camino, incluso comprobó el objeto base y nunca
encontró ninguno.
Si hiciera algo como s t r.
Si hago clic, corro.
Esto funciona porque recorre todo el camino a través de la cadena de herencia y luego llega al objeto base
y el objeto base realmente lo tiene para que no se erosione.
Y sí, puedes usar la cadena Dundar.
Ahora, encontré un gran ejemplo aquí para mostrarle por qué las herencias pueden ser confusas y por qué cosas
como MRO es posible que desee evitar o al menos ser consciente de ello.
Copiemos este código.
Y eliminemos todo esto.
Y vamos a jugar un pequeño juego.
Ahora, esta sintaxis.
Se ve así, por lo que este es el modelo de herencia de lo que acabamos de crear y parece bastante confuso, ¿no es
así?
Entonces, si los hacemos aquí.
Y verificamos el orden de resolución de método o MRO de un.
¿En qué crees que se va a pausar el pedido del video aquí e intentar adivinar cuál será el pedido?
Redi.
Hagámoslos, Dot Amaro.
Y por cierto, otra forma de hacer esto es usar el Dundar Amaro e imprimamos esto.
Muy bien, revisemos esto.
Entonces lo primero que tenemos es M. Muy bien, lo comprobamos y luego comprobamos B, comprobamos B, de acuerdo.
Y luego verificamos A, entonces lo verificamos aquí y luego verificamos X X aquí, luego Y.
Luego Z, luego el objeto de clase.
Es por eso que adivinaste, veamos el código.
¿Por qué esta orden?
Bueno, el orden se debe a la forma en que estamos pasando los parámetros, ves que B se pasa antes que A
y C.
Entonces eso significa que el orden de MRO será B, luego A.
Pero espera, después de BNA, ¿qué fue eso?
Bueno, después de B y A, tenemos la Clase X, ¿por qué X vino antes que Z?
Entonces, en lugar de ir a Z, hagamos esto un poco más grande, en lugar de ir a lo que hubiéramos
pensado que sería Z.
Va a X, luego a Y, Lindsey, luego al objeto.
Esto se debe al algoritmo que utilizan para realizar MRO, que se denomina profundidad para una búsqueda.
Ahora, esto está más allá del alcance del curso, pero como puede ver, es un poco confuso.
Y de hecho, Python realmente cambió las reglas de MRO de lo que teníamos anteriormente en las versiones más jóvenes
de Python.
Así que esta es otra de esas cosas que se actualizaron.
Pero la razón por la que te muestro esto es porque nunca te harán una prueba.
Si está escribiendo un código donde la herencia se ve así, sostengo que está escribiendo un código incorrecto
porque esto es demasiado complicado, ni siquiera hemos escrito ningún código dentro de estas clases y
ya es confuso.
Entonces, MRO está ahí como una forma de definir qué orden heredará y siempre puede usar la función MRO o
Dundar para verificar esto, pero la razón por la que lo traje aquí no es solo para confundirlo.
La razón es que existe.
Sin embargo, no debe estructurar su código de esta manera.
Esto no significa que esto no suceda en la naturaleza.
Sí, lo hace, pero al menos tiene una forma de verificar y tal vez depurar su código cuando ve un
problema como este.
Le dejaré un recurso sobre MRO si tiene mucha curiosidad y realmente quiere comprender cómo funciona
este algoritmo y cómo se determina realmente este orden.
Pero la conclusión clave es que esta es la forma en que Python trabaja para determinar, oye, cuándo se
llama a un método o atributo.
Así es como voy a buscar la jerarquía de herencias, está bien, si te duele el cerebro.
No te preocupes.
También el mio.
Tómate un descanso y te veo en el próximo video de.