Regístrate para acceder a más de 15 cursos gratuitos de programación con un simulador

Composición de objetos Python: Polimorfismo

Cuando nosotros vamos desarrollando programas más grandes en Python, empezamos a ver que las cosas se vuelven más complejas: muchas clases, muchas relaciones entre ellas, y mantener todo organizado puede ser un reto.

Aquí es donde nos ayuda un principio muy útil y poderoso: la composición de objetos.

¿Qué es la composición de objetos?

Es una forma de construir estructuras más complejas combinando objetos más simples. En otras palabras, en vez de tener una clase que haga de todo, nosotros podemos crear varias clases pequeñas que se encargan de una parte específica, y luego las juntamos.

Este enfoque hace que nuestro código sea:

  • Más fácil de entender
  • Más flexible para cambiar o mejorar
  • Más sencillo de mantener a medida que el proyecto crece

Vamos a ver cómo funciona esto en un caso real.


Caso práctico: un sistema para un hospital

Imaginemos que estamos creando una aplicación sencilla para gestionar información de un hospital. ¿Qué actores podríamos tener?

👩‍⚕️ Doctores

🤒 Pacientes

🏥 Departamentos

Empezamos creando tres clases muy simples para representarlos:

class Doctor:
    def __init__(self, name):
        self.name = name

class Patient:
    def __init__(self, name):
        self.name = name

class Department:
    def __init__(self, name):
        self.name = name

Hasta acá, cada clase tiene solo un atributo: el nombre. Pero si lo miramos bien, en la vida real estos elementos están conectados:

  • Cada doctor trabaja en un departamento
  • Cada doctor atiende varios pacientes

Así que, vamos a usar composición para modelar estas relaciones.


Usar la composición

En este paso, vamos a hacer que un objeto de tipo Doctor contenga otros objetos:

  • Un objeto de tipo Department, que representa el departamento donde trabaja
  • Una lista de objetos Patient, que son los pacientes que atiende
class Doctor:
    def __init__(self, name, department):
        self.name = name
        self.department = department  # Objeto de tipo Department
        self.patients = []            # Lista de objetos Patient

    def add_patient(self, patient):
        # Agrega un nuevo paciente al doctor
        self.patients.append(patient)

Fíjate cómo ahora un doctor tiene un departamento asignado y puede tener varios pacientes. Esto es justamente lo que queremos lograr con la composición: juntar objetos dentro de otros para formar algo más completo.

Ahora creemos algunos datos para que funcione.

# Creamos un departamento
surgery = Department("Cirugía")

# Creamos un doctor que trabaja en ese departamento
dr_smith = Doctor("Dr. Smith", surgery)

# Creamos algunos pacientes
patient1 = Patient("Juan Pérez")
patient2 = Patient("Ana Gómez")

# Asociamos los pacientes al doctor
dr_smith.add_patient(patient1)
dr_smith.add_patient(patient2)

Y así, sin necesidad de crear clases gigantescas ni complicadas herencias, podemos representar una relación realista entre departamentos, doctores y pacientes.


¿Por qué usar este enfoque?

La composición de objetos nos permite:

  • Reutilizar código (por ejemplo, podemos usar la clase Patient para otros doctores sin cambiar nada)
  • Separar responsabilidades (cada clase tiene una única labor)
  • Cambiar partes del sistema sin afectar todo (podemos cambiar la lógica del departamento sin tocar los doctores)

En vez de hacer todo en una sola clase gigante, lo separamos en piezas que podemos manejar mejor y combinar como necesitemos.


Tabla: Comparación entre herencia y composición

Característica Herencia Composición
Relación "Es un tipo de" "Tiene un/a"
Flexibilidad al combinar Más rígida Más flexible
Reutilización de componentes Limitada por jerarquía Muy alta
Cambiar una parte sin afectar otra Difícil si hay muchas clases heredadas Fácil, cada parte es independiente



Resumen

  • La composición es una técnica para crear objetos complejos de objetos más simples.
  • Permite describir relaciones del tipo “un objeto contiene a otros”.
  • Con esto, logramos un código más flexible, claro y fácil de expandir.
  • En Python, la composición se implementa creando atributos que son otros objetos.
  • Es una alternativa a la herencia que muchas veces resulta más útil y manejable.

Para acceder completo a curso necesitas un plan básico

El plan básico te dará acceso completo a todos los cursos, ejercicios y lecciones de Códica, proyectos y acceso de por vida a la teoría de las lecciones completadas. La suscripción se puede cancelar en cualquier momento.

Obtener acceso
130
cursos
1000
ejercicios
2000+
horas de teoría
3200
test

Obtén acceso

Cursos de programación para principiantes y desarrolladores experimentados. Comienza tu aprendizaje de forma gratuita

  • 130 cursos, 2000+ horas de teoría
  • 1000 ejercicios prácticos en el navegador
  • 360 000 estudiantes
Al enviar el formulario, aceptas el «Política de privacidad» y los términos de la «Oferta», y también aceptas los «Términos y condiciones de uso»

Nuestros graduados trabajan en empresas como:

Bookmate
Health Samurai
Dualboot
ABBYY