El polimorfismo es la capacidad de un objeto para tomar diferentes formas según el contexto.
En Python, esto se logra a través del “duck typing”, lo que básicamente significa que el funcionamiento de un objeto se determina por su comportamiento, en lugar de su tipo específico.
Vamos a verlo con un ejemplo. Supongamos que tenemos nuestra clase Persona
.
# Definición de la clase Persona
class Persona:
def __init__(self, nombre, edad):
self.nombre = nombre
self.edad = edad
def saludar(self):
print(f"Nombre: {self.nombre}, Edad: {self.edad}")
Y una o varias clases derivadas
# Definición de la clase Profesor que hereda de Persona
class Profesor(Persona):
def __init__(self, nombre, edad):
super().__init__(nombre, edad)
def saludar(self):
print("Soy un profesor")
# Definición de la clase Estudiante que hereda de Persona
class Estudiante(Persona):
def __init__(self, nombre, edad):
super().__init__(nombre, edad)
def saludar(self):
print("Soy un estudiante")
Por otro lado, supongamos que tenemos una función que recibe un parámetro
# Función que usa polimorfismo
def imprimir_informacion(persona):
persona.saludar()
Ahora, creamos dos instancias de Profesor
y Estudiante
respectivamente, y se lo pasamos al método imprimir_informacion
.
# Crear instancias de Persona y Estudiante
profesor = Profesor("María", 30)
estudiante = Estudiante("Luis", 20)
# Usar polimorfismo
imprimir_informacion(persona) # Imprime 'Soy un profesor'
imprimir_informacion(estudiante) # Imprime 'Soy un estudiante'
En este ejemplo,
- La función
imprimir_informacion
puede aceptar objetos tanto de la clasePersona
como de la claseEstudiante
, oProfesor
- La función llama al método
saludar
de cada objeto
Es decir, básicamente a Python “le da igual” el tipo del objeto que le pasas. Si tiene los métodos, la función llamará al método que tenga el objeto.
Le da igual su tipo, o si heredan de una clase o o no. Sólo le interesa si tiene los métodos que necesita.