Menu
Coddy logo textTech

Orden de resolución de métodos

Parte de la sección Object Oriented Programming del Journey de Python de Coddy — lección 21 de 64.

Method Resolution Order (MRO) es la secuencia que usa Python para buscar métodos cuando varias clases tienen el mismo nombre de método.

Aquí hay un ejemplo con múltiples clases que tienen el mismo método:

class A:
    def method(self):
        return "Method from A"

class B:
    def method(self):
        return "Method from B"

class C(A, B):
    pass

Comprueba el MRO usando __mro__:

print(C.__mro__)

Salida:

(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)

El atributo __mro__ es una tupla que contiene todas las clases en el orden de resolución. El primer elemento (__mro__[0]) es siempre la propia clase (C), seguida de las clases padre de izquierda a derecha (A, después B) y, finalmente, la clase de objeto integrada.

Crea un objeto y llama al método:

c = C()
print(c.method())

Salida:

Method from A

Python encontró primero el método en la clase A (en el índice 1 del MRO), por lo que usó ese.

Cambia el orden de herencia para ver la diferencia:

class D(B, A):  # B viene antes que A ahora
    pass

print(D.__mro__)
d = D()
print(d.method())

Salida:

(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
Method from B

Ahora Python encuentra primero el método de B porque B va antes que A en la lista de herencia. Puedes acceder a clases específicas en la MRO usando índices: D.__mro__[0] es D en sí misma, D.__mro__[1] es B y D.__mro__[2] es A.

También puedes usar el método mro():

print(C.mro())

Mientras que mro() y __mro__ proporcionan la misma secuencia de clases, difieren en el tipo: __mro__ devuelve una tupla, mientras que mro() devuelve una lista.

Punto clave: Python busca métodos en orden MRO: la propia clase primero (índice 0), después las clases padre de izquierda a derecha como se enumeran en la definición de la clase (índices 1, 2, etc.). El primer método encontrado es el que se utiliza.

challenge icon

Desafío

Intermedio

En este desafío, implementarás una jerarquía de clases.

Tendrás que editar estos archivos:

  • device.py: Implementa la clase base Device
  • screen.py: Implementa la clase Screen que hereda de Device
  • computer.py: Implementa la clase Computer que hereda de Device
  • laptop.py: Implementa la clase Laptop con herencia múltiple
  • driver.py - Implementa casos de prueba que verificarán que tu implementación funcione correctamente

Cada archivo contiene comentarios TODO detallados que te guiarán paso a paso a través de la implementación.

Pruébalo tú mismo

# TODO: Importa todas las clases requeridas
# from device import Device
# from screen import Screen
# from computer import Computer
# from laptop import Laptop

def explain_mro(class_name):
    # TODO: Imprime el MRO (Method Resolution Order) para la clase dada
    # TODO: Formato: "MRO for [class name]:" (nota: SIN espacio después de los dos puntos)
    # TODO: Usa class_name.__name__ para obtener el nombre de la clase
    # TODO: Usa class_name.__mro__ para obtener la tupla MRO
    # TODO: Imprime cada nombre de clase en el MRO en líneas separadas
    
    # TODO: Crea una instancia de la clase
    # TODO: Llama a power_on() en la instancia y almacena el resultado
    # TODO: Print: "Power on result: [result]"
    # TODO: Imprime una línea vacía para mejor legibilidad
    pass


# Prueba tu código
# TODO: Llama a explain_mro() con cada clase: Device, Screen, Computer y Laptop
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Object Oriented Programming