Entiende el Orden de Resolución de Métodos (Method Resolution Order - MRO)
En este paso, aprenderás sobre el Orden de Resolución de Métodos (MRO) en Python. El MRO es el orden en el que Python busca un método en una jerarquía de clases. Es particularmente importante cuando se trata de herencia múltiple.
Creemos un nuevo conjunto de clases para ilustrar el MRO. Crea un archivo llamado animal.py
en tu directorio ~/project
utilizando el editor VS Code:
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
return "Generic animal sound"
class Mammal(Animal):
def speak(self):
return "Generic mammal sound"
class Dog(Mammal):
def speak(self):
return "Woof!"
class Cat(Mammal):
def speak(self):
return "Meow!"
Guarda el archivo animal.py
.
Ahora, creemos un nuevo archivo llamado mro_example.py
en el directorio ~/project
para demostrar el MRO:
from animal import Animal, Mammal, Dog, Cat
my_dog = Dog("Buddy")
my_cat = Cat("Whiskers")
print(my_dog.speak())
print(my_cat.speak())
Guarda el archivo mro_example.py
.
En este ejemplo:
Animal
es la clase base con un método speak
.
Mammal
hereda de Animal
y anula el método speak
.
Dog
hereda de Mammal
y anula el método speak
.
Cat
hereda de Mammal
y anula el método speak
.
Cuando llamas a my_dog.speak()
, Python primero busca el método speak
en la clase Dog
. Si no lo encuentra allí, lo busca en la clase Mammal
y luego en la clase Animal
. Este orden está determinado por el MRO.
Para ejecutar el script mro_example.py
, abre tu terminal y navega hasta el directorio ~/project
:
cd ~/project
Luego, ejecuta el script utilizando el comando python
:
python mro_example.py
Deberías ver la siguiente salida:
Woof!
Meow!
Ahora, exploremos un ejemplo más complejo con herencia múltiple. Crea un nuevo archivo llamado mro_complex.py
en el directorio ~/project
:
class A:
def method(self):
return "A"
class B(A):
def method(self):
return "B"
class C(A):
def method(self):
return "C"
class D(B, C):
pass
d = D()
print(d.method())
print(D.mro())
Guarda el archivo mro_complex.py
.
En este ejemplo:
- La clase
D
hereda tanto de B
como de C
.
- Tanto
B
como C
heredan de A
.
- El método
method
está definido en las tres clases A
, B
y C
.
Para ejecutar el script mro_complex.py
, abre tu terminal y navega hasta el directorio ~/project
:
cd ~/project
Luego, ejecuta el script utilizando el comando python
:
python mro_complex.py
Deberías ver la siguiente salida:
B
[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]
La salida B
indica que se llama al método method
de la clase B
. El método D.mro()
devuelve una tupla que representa el orden de resolución de métodos para la clase D
. En este caso, el MRO es D -> B -> C -> A -> object
. Esto significa que cuando llamas a d.method()
, Python primero busca el método en la clase D
, luego en la clase B
, luego en la clase C
, luego en la clase A
y finalmente en la clase base object
.
Comprender el MRO es esencial para predecir el comportamiento de tu código cuando se utiliza la herencia, especialmente la herencia múltiple.