Objetivo de aprendizaje

Dominar los fundamentos de la Programación Orientada a Objetos en Python, construyendo clases que modelen entidades del mundo real, aplicando los principios de encapsulación, herencia y polimorfismo mediante ejercicios prácticos, para desarrollar soluciones de software estructuradas, modulares y reutilizables que fomenten el pensamiento lógico, la creatividad técnica y una actitud colaborativa frente a problemas computacionales.

Contextualización

Imagina que estás organizando una reunión con tus amigos. Tienes una lista de contactos, cada uno con nombre, teléfono y correo. En lugar de manejar tres listas separadas (una para nombres, otra para teléfonos, otra para correos), ¿no sería mejor tener un solo "objeto" que reúna toda la información de cada persona?

Así es como piensa la Programación Orientada a Objetos: agrupando datos y comportamientos relacionados en entidades coherentes. Cuando juegas un videojuego, cada personaje, cada enemigo, cada item del inventario es un "objeto" que tiene propiedades (vida, posición, color) y acciones (moverse, atacar, usar).

En este taller, vamos a aprender a crear nuestros propios "moldes" (clases) para generar objetos que representen cosas del mundo real: desde estudiantes y profesores hasta animales y vehículos. Verás cómo esta forma de pensar transforma problemas complejos en conjuntos de piezas que interactúan entre sí, como en un ecosistema digital.

Desarrollo de la actividad

Vamos a explorar los cuatro pilares fundamentales de la POO con ejemplos prácticos y contextualizados a nuestra realidad:

1. Clases y objetos: Modelando estudiantes

Una clase es como un molde para crear objetos. Por ejemplo, podemos crear una clase Estudiante que tenga propiedades como nombre, edad y promedio.

class Estudiante:
    # Constructor: método especial que se ejecuta al crear un objeto
    def __init__(self, nombre, edad, promedio):
        self.nombre = nombre      # Atributo: nombre del estudiante
        self.edad = edad        # Atributo: edad del estudiante
        self.promedio = promedio  # Atributo: promedio académico
    
    # Método: acción que puede realizar el objeto
    def estudiar(self, materia):
        return f"{self}.nombre está estudiando {materia}"
    
    # Método para mostrar información del estudiante
    def mostrar_info(self):
        return f"Nombre: {self}.nombre, Edad: {self}.edad, Promedio: {self}.promedio"

# Creando objetos (instancias) de la clase Estudiante
estudiante1 = Estudiante("María García", 16, 8.5)
estudiante2 = Estudiante("Carlos Méndez", 17, 9.2)

# Usando los métodos de los objetos
print(estudiante1.estudiar("Matemáticas"))
print(estudiante2.mostrar_info())

2. Encapsulación: Protegiendo nuestros datos

La encapsulación nos permite ocultar los detalles internos de una clase y exponer solo lo necesario. En Python, usamos convenciones como el guion bajo para indicar atributos "protegidos".

class CuentaBancaria:
    def __init__(self, titular, saldo_inicial):
        self.titular = titular
        self._saldo = saldo_inicial  # Atributo "protegido" (convención)
    
    def depositar(self, cantidad):
        if cantidad > 0:
            self._saldo += cantidad
            return True
        return False
    
    def retirar(self, cantidad):
        if 0 < cantidad <= self._saldo:
            self._saldo -= cantidad
            return True
        return False
    
    def consultar_saldo(self):
        return self._saldo

# Uso de la clase con encapsulación
mi_cuenta = CuentaBancaria("Ana López", 1000)
mi_cuenta.depositar(500)
mi_cuenta.retirar(200)
print(f"Saldo actual: {mi_cuenta.consultar_saldo()}")

El reto final

Imagina que tu colegio quiere implementar un sistema para gestionar las actividades extracurriculares. Cada actividad tiene un nombre, un instructor, un cupo máximo de estudiantes y una lista de estudiantes inscritos.

Tu misión: Crea un sistema en Python que permita gestionar estas actividades extracurriculares utilizando todos los conceptos de POO que hemos aprendido.

Requisitos del sistema:

  1. Define una clase ActividadExtra con los atributos: nombre, instructor, cupo_maximo, estudiantes_inscritos (lista).
  2. Implementa métodos para:
    • Inscribir un estudiante (verificando que haya cupo disponible)
    • Retirar un estudiante
    • Mostrar la información de la actividad
    • Mostrar la lista de estudiantes inscritos
  3. Crea una clase Estudiante (como la del ejemplo) y úsala para crear objetos estudiantes.
  4. Crea al menos 3 actividades diferentes (música, deporte, robótica).
  5. Simula la inscripción de varios estudiantes a las actividades.
  6. Implementa una función que muestre un reporte general de todas las actividades.

Desafío adicional (para los más curiosos):

  • Crea una clase Instructor con sus propios atributos y métodos.
  • Implementa herencia: crea una clase ActividadDeporte que herede de ActividadExtra y añada atributos específicos como "tipo_deporte" y "requiere_equipo".
  • Añade validaciones para evitar que un estudiante se inscriba en dos actividades al mismo horario.

Evaluación lúdica

¡Pon a prueba lo que has aprendido! Responde las siguientes preguntas. Cada respuesta correcta suma 20 puntos. ¡Intenta llegar a 100!

1. ¿Qué es una clase en Programación Orientada a Objetos?
Un tipo de dato primitivo como int o str
Una función especial que realiza operaciones matemáticas
Un molde o plantilla para crear objetos
Una variable global que almacena configuraciones
2. ¿Cuál es la función del método __init__ en una clase Python?
Destruir el objeto cuando ya no se necesita
Inicializar el objeto (constructor)
Convertir el objeto a una representación de string
Comparar dos objetos para ver si son iguales
3. ¿Qué principio de POO nos permite ocultar los detalles internos de una clase?
Herencia
Encapsulación
Polimorfismo
Abstracción
4. En el ejemplo de la clase Estudiante, ¿qué representa "self.nombre"?
El nombre de la clase
Una variable global accesible desde cualquier parte
Un atributo del objeto (instancia)
El nombre del archivo Python
5. Si creamos una clase "Perro" que hereda de una clase "Animal", ¿qué principio de POO estamos aplicando?
Encapsulación
Herencia
Polimorfismo
Cohesión

Tu puntuación

0/100