Orden de resolución de métodos
Parte de la sección Programación orientada a objetos 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í tienes un ejemplo con varias 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__)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]) siempre es la propia clase (C), seguido de las clases principales de izquierda a derecha (A, después B) y, por último, la clase integrada object.
Crea un objeto y llama al método:
c = C()
print(c.method())Salida:
Method from APython encontró primero el método en la clase A (en el índice 1 del MRO), así que usó ese.
Cambia el orden de herencia para ver la diferencia:
class D(B, A): # B va 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 mediante índices: D.__mro__[0] es D, D.__mro__[1] es B y D.__mro__[2] es A.
También puedes usar el método mro():
print(C.mro())Aunque 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 el orden del MRO: primero en la propia clase (índice 0) y después en las clases padre de izquierda a derecha, tal como aparecen en la definición de la clase (índices 1, 2, etc.). Se usa 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 claseScreen, que hereda deDevicecomputer.py: Implementa la claseComputer, que hereda deDevicelaptop.py: Implementa la claseLaptopcon herencia múltipledriver.py- Implementa los casos de prueba que verificarán que tu implementación funcione correctamente
Cada archivo contiene comentarios detallados TODO que te guiarán paso a paso en la implementación.
Pruébalo tú mismo
# TODO: Importa todas las clases necesarias
# 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 (orden de resolución de métodos) de la clase indicada
# 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 del MRO
# TODO: Imprime el nombre de cada clase del MRO en una línea distinta
# TODO: Crea una instancia de la clase
# TODO: Llama a power_on() en la instancia y guarda el resultado
# TODO: Imprime: "Power on result: [result]"
# TODO: Imprime una línea en blanco para mejorar la legibilidad
pass
# Prueba tu código
# TODO: Llama 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 Programación orientada a objetos
1Fundamentos de la POO
Introducción a la POOArchivos externosClases vs. objetosEl parámetro selfMétodosAtributosMétodo constructor (__init__)Repaso: calculadora sencilla4Herencia
Herencia básicaLa función super()Sobrescritura de métodosHerencia múltipleOrden de resolución de métodosRepaso: 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 de propiedadDecorador de método estáticoDecorador de método de clase5Polimorfismo
Repaso de la sobrescritura de métodosTipado patoClases y métodos abstractosDiseño de interfacesRepaso: calculadora de formas8Conceptos avanzados de POO
Composición frente a 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. variables de claseDecoradores de propiedadesAtributos privadosRepaso: gestor de cuentas bancariasPractica por tu cuenta: Compilador de Python online