Sobreescritura de métodos revisitada
Parte de la sección Object Oriented Programming del Journey de Python de Coddy — lección 23 de 64.
El polimorfismo significa "muchas formas" y permite que objetos de diferentes clases respondan de manera diferente a la misma llamada a un método. La sobrescritura de métodos hace que esto sea posible.
Aquí hay una clase padre con un método:
class Animal:
def speak(self):
return "Animal makes a sound"Crea clases hijas que sobrescriban el mismo método:
class Dog(Animal):
def speak(self):
return "Woof!"
class Cat(Animal):
def speak(self):
return "Meow!"
class Cow(Animal):
def speak(self):
return "Moo!"Cada clase hija proporciona su propia implementación de speak().
Crea una lista de diferentes animales:
animals = [Dog(), Cat(), Cow(), Animal()]Llamar al mismo método en todos los objetos:
for animal in animals:
print(animal.speak())Salida:
Woof!
Meow!
Moo!
Animal makes a soundEsto es polimorfismo en acción: la misma llamada al método se comporta de manera diferente según el tipo real del objeto.
También puedes usar el polimorfismo con funciones:
def make_animal_speak(animal):
print(animal.speak())
dog = Dog()
cat = Cat()
make_animal_speak(dog) # ¡Guau!
make_animal_speak(cat) # ¡Miau!La función no necesita saber qué tipo de animal recibe; simplemente llama a speak() y obtiene el comportamiento correcto.
Punto clave: El polimorfismo permite tratar diferentes objetos de la misma manera a través de una interfaz común. La sobrescritura de métodos proporciona diferentes implementaciones, mientras que el polimorfismo permite llamarlas de manera uniforme. Esto hace que el código sea más flexible y fácil de extender.
Desafío
IntermedioEn este desafío, implementarás un sistema de herencia de vehículos.
Necesitarás editar estos archivos:
vehicle.py: Implementa la clase baseVehiclecon atributos de marca/modelo y métodoscar.py: Crea la claseCarque hereda deVehiclemotorcycle.py: Crea la claseMotorcycleque hereda deVehicletruck.py: Crea la claseTruckque hereda deVehicle
Cada archivo contiene comentarios TODO detallados para guiar tu implementación paso a paso. Presta atención a las sentencias de importación necesarias entre los archivos y sigue las relaciones de herencia. El archivo driver.py contiene casos de prueba que verificarán que tu implementación funcione correctamente en todos los tipos de vehículos.
Hoja de referencia
El polimorfismo permite que objetos de diferentes clases respondan de manera distinta a la misma llamada a un método a través de la sobrescritura de métodos.
Crea una clase padre con un método:
class Animal:
def speak(self):
return "Animal makes a sound"Las clases hijas sobrescriben el mismo método:
class Dog(Animal):
def speak(self):
return "Woof!"
class Cat(Animal):
def speak(self):
return "Meow!"Llama al mismo método en diferentes objetos:
animals = [Dog(), Cat(), Animal()]
for animal in animals:
print(animal.speak()) # Cada uno imprime una salida diferenteUsa el polimorfismo con funciones:
def make_animal_speak(animal):
print(animal.speak())
make_animal_speak(Dog()) # Woof!
make_animal_speak(Cat()) # Meow!El polimorfismo te permite tratar diferentes objetos de la misma manera a través de una interfaz común, haciendo que el código sea más flexible y fácil de extender.
Pruébalo tú mismo
from vehicle import Vehicle
from car import Car
from motorcycle import Motorcycle
from truck import Truck
def vehicle_info(vehicle):
return f"{vehicle.make} {vehicle.model}: {vehicle.start()}, Efficiency: {vehicle.fuel_efficiency()} mpg"
# Probar con diferentes vehículos - NO MODIFICAR ESTE CÓDIGO DE PRUEBA
vehicles = [
Car("Toyota", "Camry"),
Motorcycle("Harley", "Davidson"),
Truck("Ford", "F-150"),
Vehicle("Generic", "Vehicle")
]
for v in vehicles:
print(vehicle_info(v))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