PyQuiz 49 – Override de método en Python

El reto
class Animal:
def hablar(self):
return '...'
class Gato(Animal):
def hablar(self):
return 'Miau'
print(Gato().hablar())¿Cuál es el resultado?
- a) 'Miau'
- b) '…'
- c) Error
Piensa tu respuesta antes de seguir leyendo…
Concepto: Override de método
La sobreescritura de métodos (method override) ocurre cuando una subclase define un método con el mismo nombre que uno de la clase padre. Cuando se llama al método en una instancia de la subclase, Python usa la versión de la subclase, ignorando la del padre.
Este es uno de los pilares del polimorfismo en POO: diferentes clases pueden tener el mismo nombre de método pero comportamientos distintos. Python busca el método en el orden MRO (Method Resolution Order): primero en la clase propia, luego en la clase padre, luego en la abuela, etc.
class Animal:
def hablar(self):
return '...'
class Perro(Animal):
def hablar(self): # sobreescribe el método del padre
return 'Guau'
class Pez(Animal):
pass # hereda hablar() del padre
print(Perro().hablar()) # 'Guau'
print(Pez().hablar()) # '...'Paso a paso
class Animal:— Se define la clase base con el métodohablar()que devuelve'...'.class Gato(Animal):— Se defineGatoheredando deAnimal.def hablar(self): return 'Miau'—Gatodefine su propia versión dehablar(). Este método sobreescribe el deAnimal.Gato()— Se crea una instancia anónima deGato.Gato().hablar()— Python buscahablaren la claseGatoprimero. Lo encuentra (la versión sobreescrita). Se llama y devuelve'Miau'.print(Gato().hablar())— Se imprime'Miau'.
📥 Llévate el cheatsheet de Python (gratis)
PDF de 6 páginas con lo esencial: tipos, condicionales, bucles, estructuras de datos, funciones y los errores que más vas a cometer. Para tener al lado mientras programas.
Sin spam. Te apuntas a la lista, descargas el cheatsheet y recibes contenido de Python cada semana.
Solución
Respuesta correcta: A) 'Miau'
Gato sobreescribe hablar(). Se usa el método de la clase hija: 'Miau'.
Sabías que…
Con super() puedes llamar al método del padre desde dentro del método sobreescrito, ampliando su funcionalidad en lugar de reemplazarla completamente:
class Animal:
def hablar(self):
return '...'
def describir(self):
return f'Soy un {type(self).__name__}'
class Gato(Animal):
def hablar(self):
# Extiende en lugar de reemplazar
base = super().hablar()
return f'{base} → Miau'
class GatoSiames(Gato):
def hablar(self):
return 'Miau miau (siamés)'
print(Gato().hablar()) # '... → Miau'
print(GatoSiames().hablar()) # 'Miau miau (siamés)'Prueba tú mismo
Si agregas class GatoSiames(Gato): pass sin definir hablar(), ¿qué devuelve GatoSiames().hablar()? ¿'Miau' o '...'?
Más PyQuizzes en elpythonista.com/pyquizzes
Tutorial relacionado: Tutorial de Python
¿Quieres aprender Python en orden, no a saltos?
Esto que has leído es solo una pieza. En El Pythonista lo verás todo encadenado: 11 módulos, 37+ horas de vídeo, 734 actividades y un proyecto real (MovieTracker) que crece contigo desde la primera variable hasta el deploy a producción.
37+ horas · 734 actividades · Proyecto real · Acceso de por vida · 14 días de garantía
