PyQuiz 49 - Override de método en Python | Quiz interactivo

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

  1. class Animal: — Se define la clase base con el método hablar() que devuelve '...'.
  2. class Gato(Animal): — Se define Gato heredando de Animal.
  3. def hablar(self): return 'Miau' — Gato define su propia versión de hablar(). Este método sobreescribe el de Animal.
  4. Gato() — Se crea una instancia anónima de Gato.
  5. Gato().hablar() — Python busca hablar en la clase Gato primero. Lo encuentra (la versión sobreescrita). Se llama y devuelve 'Miau'.
  6. 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.

Ver el curso completo →

37+ horas · 734 actividades · Proyecto real · Acceso de por vida · 14 días de garantía

Compartir