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.
El Orden de Resolución de Métodos (MRO) es la secuencia que Python utiliza 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):
passComprueba el MRO usando __mro__:
print(C.__mro__)Resultado:
(<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 clase misma (C), seguida de las clases padre de izquierda a derecha (A, luego B) y, finalmente, la clase de objeto integrada.
Crea un objeto y llama al método:
c = C()
print(c.method())Salida:
Method from APython encontró el método en la clase A primero (en el índice 1 del MRO), así 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 BAhora Python encuentra primero el método de B porque B aparece antes que A en la lista de herencia. Puedes acceder a clases específicas en el MRO usando indexación - D.__mro__[0] es la propia D, D.__mro__[1] es B y D.__mro__[2] es A.
También puedes usar el método mro():
print(C.mro())Esto da el mismo resultado que __mro__ pero como una lista.
Punto clave: Python busca métodos en el orden MRO: primero la clase misma (índice 0), luego las clases de las que hereda de izquierda a derecha según aparecen en la definición de la clase (índices 1, 2, etc.). Se utiliza el primer método encontrado.
Desafío
IntermedioEn este desafío, implementarás una jerarquía de clases.
Tendrás que editar estos archivos:
device.py: Implementa la clase baseDevicescreen.py: Implementa la claseScreenque hereda deDevicecomputer.py: Implementa la claseComputerque hereda deDevicelaptop.py: Implementa la claseLaptopcon herencia múltipledriver.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.
Hoja de referencia
El Orden de Resolución de Métodos (MRO) es la secuencia que Python utiliza para buscar métodos cuando varias clases tienen el mismo nombre de método.
Verifique el MRO usando __mro__ o mro():
class A:
def method(self):
return "Method from A"
class B:
def method(self):
return "Method from B"
class C(A, B):
pass
print(C.__mro__)
print(C.mro()) # Mismo resultado como una listaPython busca métodos en el orden del MRO: primero la propia clase, luego las clases de las que hereda de izquierda a derecha según se enumeran en la definición de la clase:
c = C()
print(c.method()) # "Method from A" - A viene antes que B
class D(B, A): # B viene antes que A ahora
pass
d = D()
print(d.method()) # "Method from B" - B viene antes que APruébalo tú mismo
# TODO: Importar 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: Imprimir 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: Usar class_name.__name__ para obtener el nombre de la clase
# TODO: Usar class_name.__mro__ para obtener la tupla MRO
# TODO: Imprimir cada nombre de clase en el MRO en líneas separadas
# TODO: Crear una instancia de la clase
# TODO: Llamar a power_on() en la instancia y almacenar el resultado
# TODO: Imprimir: "Power on result: [result]"
# TODO: Imprimir una línea vacía para una mejor legibilidad
pass
# Prueba tu código
# TODO: Llamar a explain_mro() con cada clase: Device, Screen, Computer, y Laptop
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Object Oriented Programming
1Fundamentos de la POO
Archivos externosIntroducción a la POOClases vs ObjetosEl parámetro selfMétodosAtributosMétodo constructor (__init__)Resumen - Calculadora simple4Herencia
Herencia básicaLa función super()Sobrescritura de métodosHerencia múltipleOrden de resolución de métodosResumen - Jerarquía de empleados7Métodos especiales
Introducción a los métodos mágicosSobrecarga de operadoresMétodos mágicos de contenedoresRepaso - Lista personalizada10Patrones de diseño Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón Strategy2Decoradores
Introducción a los decoradoresDecorador propertyDecorador de métodos estáticosDecorador de métodos de clase5Polimorfismo
Sobreescritura de métodos revisitadaDuck TypingClases y métodos abstractosDiseño de interfacesResumen - Calculadora de figuras8Conceptos avanzados de POO
Composición vs. HerenciaMixinsMétodos estáticos y de claseDecoradores de claseGestores de contexto11Patrones de diseño, parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón Composite3Propiedades de clase
Variables de instancia vs de claseDecoradores de propiedadesAtributos privadosResumen - Gestor de cuentas bancarias