Polimorfismo
Al construir una jerarquía de clases, no se trata solo de organizar clases sin propósito. Es esencial analizar el problema cuidadosamente para determinar qué clases deben estar en la parte superior y cuáles en la inferior. Un punto clave para recordar es cómo se gestionan los métodos cuando son redefinidos en las subclases, lo que afecta directamente al comportamiento de la jerarquía.
En el siguiente ejemplo, tenemos dos clases: Uno y Dos, donde Dos hereda de Uno. Ambas clases definen el método opera(). El método operacion() invoca opera() dentro de la clase Uno, pero dependiendo de si se invoca en un objeto de Uno o de Dos, el resultado cambia.
class Uno:
def opera(self):
print("Escribo 1")
def operacion(self):
self.opera()
class Dos(Uno):
def opera(self):
print("Escribo 2")
objeto1 = Uno()
objeto2 = Dos()
objeto1.operacion() # Salida: Escribo 1
objeto2.operacion() # Salida: Escribo 2
- La primera invocación de
operacion()en un objeto de la claseUnollama al métodoopera()definido enUno. - La segunda invocación de
operacion()en un objeto de la claseDosllama al métodoopera()redefinido enDos. Esto sucede a pesar de queopera()se invoca dentro de la claseUno, lo que demuestra el funcionamiento del polimorfismo.
Polimorfismo y métodos virtuales
Esta situación, donde una subclase puede modificar el comportamiento de su superclase, se denomina polimorfismo. El término proviene del griego, donde “polys” significa “muchos” y “morphe” significa “forma”. En este contexto, significa que una misma clase puede adoptar diferentes formas dependiendo de cómo sus subclases redefinen ciertos métodos.
Cuando un método de una subclase cambia el comportamiento de su superclase, este método se llama método virtual. Esto resalta que ninguna clase tiene su comportamiento completamente fijo, ya que siempre puede ser modificado por una subclase.