Ing. Bernardo Prado · UTH 2026-2 · DSM3
Aprenderás qué es la POO, para qué sirve, y construirás tu primera clase en Python desde cero, línea por línea. No se asume ningún conocimiento previo.
Antes de escribir una sola línea de código necesitas tener instalado lo siguiente. Si ya lo tienes, ¡salta directo a la Sección 1!
Ve a python.org y descarga la versión más reciente (3.11 o superior). Durante la instalación, en la primera pantalla marca la casilla que dice "Add Python to PATH" antes de hacer clic en "Install Now".
Deberías ver una ventana con la casilla "Add Python 3.x to PATH" en la parte inferior. Marca esa casilla antes de continuar.
Para verificar que quedó bien instalado, abre una terminal (en Windows: tecla Windows + R, escribe cmd, presiona Enter) y escribe:
python --version
Ve a code.visualstudio.com, descarga el instalador para tu sistema operativo e instálalo con los valores predeterminados. VS Code es el editor de código que usaremos durante todo el curso.
Verás una pantalla de bienvenida con fondo oscuro. En el panel izquierdo hay íconos de explorador de archivos, búsqueda, control de versiones, etc.
Dentro de VS Code, en el panel lateral izquierdo haz clic en el ícono de cuadraditos (Extensiones) o presiona Ctrl + Shift + X. En el buscador escribe Python. La primera opción que aparece es la de Microsoft. Haz clic en Install.
La extensión muestra el logo de Python (serpiente) y el publicador "Microsoft". El botón azul dice "Install".
Crea una carpeta en tu computadora para guardar todos los proyectos del curso. Por ejemplo: C:\POO_UTH\ o Documentos/POO_UTH/. Luego, dentro de esa carpeta crea una subcarpeta llamada Unidad1.
En VS Code ve a Archivo → Abrir Carpeta y selecciona la carpeta Unidad1 que acabas de crear. Esto es tu área de trabajo para esta práctica.
Antes de escribir código, necesitamos entender el por qué. Lee esta sección con calma, es la base de todo.
Piensa en un estudiante de la UTH. Ese estudiante tiene características:
Y también puede hacer cosas:
En POO, a las características las llamamos atributos, y a las acciones las llamamos métodos. Ambos viven juntos dentro de una clase.
| Concepto | ¿Qué es? | Ejemplo |
|---|---|---|
| Clase | Es el molde o plantilla. Define cómo será algo. | El plano de una casa |
| Objeto | Es una instancia real creada a partir de la clase. | Una casa construida con ese plano |
| Atributo | Una característica o dato que tiene el objeto. | El color de la casa, sus metros cuadrados |
| Método | Una acción o comportamiento que puede hacer el objeto. | Abrir la puerta, encender la luz |
UML (Unified Modeling Language) es una forma visual de representar clases antes de escribir código. El diagrama tiene 3 partes:
nombre : str
matricula : str
carrera : str
promedio : float
__init__() → None
mostrar_info() → None
esta_aprobado() → bool
actualizar_promedio(nuevo) → None
Estudiante en Python, tal como la muestra el diagrama. Al final, tu código reflejará perfectamente este diagrama UML.
La coordinación académica de la UTH necesita un programa básico para registrar la información de sus estudiantes de la carrera DSM. El sistema debe poder:
Tu tarea: Construir este sistema usando POO en Python con una clase llamada Estudiante.
| Variable / Atributo | Tipo | Ejemplo de valor | ¿Para qué sirve? |
|---|---|---|---|
nombre | str | "Ana López" | Nombre completo del estudiante |
matricula | str | "DSM2024001" | Número único que identifica al estudiante |
carrera | str | "DSM" | Carrera en la que está inscrito |
promedio | float | 8.5 | Promedio de calificaciones (0.0 a 10.0) |
MINIMO_APROBATORIO | float | 7.0 | La calificación mínima para estar aprobado |
Con la carpeta Unidad1 abierta en VS Code, haz clic derecho en el explorador de archivos (panel izquierdo) y selecciona "New File" (Nuevo Archivo). Nómbralo:
sistema_estudiantes.py
Haz clic derecho en el panel izquierdo → "New File" → escribe el nombre → presiona Enter. El archivo aparecerá en el explorador y se abrirá en el editor central.
.py para que VS Code lo reconozca como Python y lo coloree correctamente. Sin esa extensión, el editor no sabrá que es código Python.
Lo primero que escribiremos es un comentario explicando qué hace el programa. Los comentarios en Python comienzan con el símbolo # y Python los ignora al ejecutar el código — solo son para que los humanos entiendan qué hace cada parte.
# =====================================================
# Práctica Unidad 1 - Programación Orientada a Objetos
# Asignatura: POO | UTH 2026-2
# Tema: Clases, Objetos, Atributos y Métodos
# Archivo: sistema_estudiantes.py
# =====================================================
Estudiante Paso a PasoAhora sí — vamos a escribir código. Cada bloque se explica línea por línea antes de escribirlo.
classEn Python, para crear una clase se usa la palabra reservada class seguida del nombre de la clase y dos puntos (:). El nombre de la clase, por convención, siempre empieza con Mayúscula (esto se llama PascalCase).
Escribe esto justo debajo del encabezado que ya tienes:
class Estudiante:
"""Clase que representa a un estudiante de la UTH."""
| Fragmento de código | Explicación detallada |
|---|---|
class |
Palabra reservada de Python que le dice: "voy a definir una clase nueva". Es como decir "voy a crear un molde". |
Estudiante |
Es el nombre que le damos a nuestra clase. Empieza con mayúscula por convención. Podrías llamarla de otra forma, pero "Estudiante" es descriptivo. |
: |
Los dos puntos indican que lo que viene a continuación, con sangría (indentación), pertenece a la clase. En Python la sangría (4 espacios o 1 Tab) es OBLIGATORIA. |
"""Clase que representa...""" |
Esto es un docstring (documentación de la clase). Las triples comillas permiten texto en múltiples líneas. Le dice a quien lea el código qué hace esta clase. |
IndentationError. VS Code te ayuda añadiendo la sangría automáticamente al presionar Enter después de los dos puntos.
MINIMO_APROBATORIOExisten dos tipos de atributos: los de clase (compartidos por todos los objetos) y los de instancia (únicos de cada objeto). Aquí agregaremos uno de clase: el mínimo aprobatorio. Como es igual para todos los estudiantes, lo definimos a nivel de clase.
Escribe esto dentro de la clase, con 4 espacios de sangría:
class Estudiante:
"""Clase que representa a un estudiante de la UTH."""
# Atributo de clase: es igual para todos los objetos Estudiante
MINIMO_APROBATORIO = 7.0
| Fragmento | Explicación |
|---|---|
MINIMO_APROBATORIO |
Nombre en MAYÚSCULAS indica que es una constante (valor que no cambia). Es una convención de Python. Este valor es 7.0 para TODOS los estudiantes. |
= |
El operador de asignación. Guarda el valor de la derecha en la variable de la izquierda. |
7.0 |
Un número decimal (tipo float). Usamos 7.0 y no 7 para ser explícitos de que es un número con decimales. |
__init__El método __init__ es especial — Python lo llama automáticamente cada vez que creas un nuevo objeto. Su trabajo es inicializar los atributos de ese objeto particular. Piénsalo como el "nacimiento" del objeto: cuando nace un estudiante, se le asignan sus datos iniciales.
self?
self es una referencia al propio objeto que se está creando. Cuando escribes self.nombre = nombre, le estás diciendo: "guarda el valor del parámetro nombre EN ESTE MISMO OBJETO". Sin self, el dato se perdería al terminar el método.
class Estudiante:
"""Clase que representa a un estudiante de la UTH."""
MINIMO_APROBATORIO = 7.0
def __init__(self, nombre, matricula, carrera, promedio=0.0):
"""
Constructor: se ejecuta automáticamente al crear un objeto.
Parámetros:
nombre (str) → Nombre completo del estudiante
matricula (str) → Clave única del estudiante
carrera (str) → Nombre de la carrera
promedio (float) → Promedio inicial (por defecto 0.0)
"""
self.nombre = nombre # atributo de instancia
self.matricula = matricula # atributo de instancia
self.carrera = carrera # atributo de instancia
self.promedio = promedio # atributo de instancia
| Fragmento | Explicación detallada |
|---|---|
def |
Palabra reservada para definir una función o método. Siempre va antes del nombre del método. |
__init__ |
Nombre especial del constructor. Los dobles guiones bajos (__) indican que es un método "mágico" (dunder method) que Python reconoce automáticamente. |
self |
Siempre es el PRIMER parámetro de cualquier método de una clase. Representa al objeto actual. Python lo pasa automáticamente — tú no necesitas enviarlo al llamar el método. |
nombre, matricula, carrera |
Parámetros que quien cree el objeto debe proporcionar. Son los datos necesarios para "registrar" a un estudiante. |
promedio=0.0 |
Parámetro con valor por defecto. Si no se proporciona, Python usa 0.0. Esto hace que sea opcional al crear el objeto. |
self.nombre = nombre |
Toma el valor del parámetro nombre y lo guarda como atributo del objeto. A partir de este momento, self.nombre guarda el dato para toda la vida del objeto. |
mostrar_info() — Imprime los datos del estudianteEste método muestra en pantalla toda la información del estudiante. No recibe parámetros adicionales (aparte de self) porque ya tiene acceso a los atributos del objeto a través de self.
def mostrar_info(self):
"""Imprime en pantalla la información completa del estudiante."""
print("=" * 40)
print(f" FICHA DE ESTUDIANTE")
print("=" * 40)
print(f" Nombre : {self.nombre}")
print(f" Matrícula : {self.matricula}")
print(f" Carrera : {self.carrera}")
print(f" Promedio : {self.promedio:.1f}")
print("=" * 40)
| Fragmento | Explicación |
|---|---|
def mostrar_info(self): |
Definimos un método llamado mostrar_info. Sólo recibe self porque no necesita datos externos. |
print("=" * 40) |
Imprime el carácter = repetido 40 veces. Es solo para que la salida se vea bonita y ordenada. |
f" Nombre : {self.nombre}" |
Una f-string (cadena formateada). La f antes de la comilla indica que lo que esté dentro de {} se evaluará como código Python. {self.nombre} se reemplaza con el valor real del atributo. |
{self.promedio:.1f} |
El :.1f es un formato especial que muestra el número con exactamente 1 decimal. Así, 8.5678 se muestra como 8.6. |
esta_aprobado() — Retorna True o FalseEste método compara el promedio del estudiante contra el mínimo aprobatorio y devuelve un valor booleano (True si está aprobado, False si no).
def esta_aprobado(self):
"""
Retorna True si el promedio es >= al mínimo aprobatorio.
Retorna False si el estudiante está reprobado.
"""
return self.promedio >= Estudiante.MINIMO_APROBATORIO
| Fragmento | Explicación |
|---|---|
return |
Esta palabra hace que el método entregue un valor a quien lo llamó. Es como la respuesta de una pregunta. |
self.promedio >= Estudiante.MINIMO_APROBATORIO |
Compara el promedio del estudiante con el valor 7.0. Si el promedio es mayor o igual a 7.0, la comparación es True; si no, es False. Ese resultado es lo que se retorna. |
Estudiante.MINIMO_APROBATORIO |
Accedemos al atributo de clase usando el nombre de la clase, no self. Aunque también podría usarse self.MINIMO_APROBATORIO, es más claro así. |
actualizar_promedio() — Modifica el promedioEste método permite cambiar el promedio del estudiante. Incluye validación: el nuevo promedio debe estar entre 0.0 y 10.0.
def actualizar_promedio(self, nuevo_promedio):
"""
Actualiza el promedio del estudiante.
Parámetro:
nuevo_promedio (float) → Nuevo valor del promedio (0.0 - 10.0)
"""
if 0.0 <= nuevo_promedio <= 10.0:
self.promedio = nuevo_promedio
print(f"✅ Promedio actualizado a {nuevo_promedio:.1f} para {self.nombre}")
else:
print(f"❌ Error: el promedio debe estar entre 0.0 y 10.0")
| Fragmento | Explicación |
|---|---|
nuevo_promedio |
Parámetro que recibe el método. Quien llame a este método debe proporcionar el nuevo valor del promedio. |
if 0.0 <= nuevo_promedio <= 10.0: |
Validación: verifica que el valor esté en el rango correcto. Python permite encadenar comparaciones así (matemáticamente natural). |
self.promedio = nuevo_promedio |
Si la validación pasa, el atributo promedio del objeto se reemplaza con el nuevo valor. |
else: |
Si la condición del if es falsa (el valor no está en el rango), se ejecuta este bloque alternativo. |
__str__() — Representación en textoEl método __str__ es otro método "mágico". Python lo llama automáticamente cuando intentas imprimir un objeto directamente con print(objeto). Debe retornar una cadena de texto.
def __str__(self):
"""Retorna una cadena de texto que representa al estudiante."""
estado = "✅ Aprobado" if self.esta_aprobado() else "❌ Reprobado"
return f"[{self.matricula}] {self.nombre} | Promedio: {self.promedio:.1f} | {estado}"
estado = "✅ Aprobado" if self.esta_aprobado() else "❌ Reprobado" es un operador ternario — una forma compacta de un if/else en una sola línea. Si esta_aprobado() retorna True, estado será "✅ Aprobado"; si retorna False, será "❌ Reprobado".
Aquí está el código completo tal como debería verse tu archivo hasta ahora. Compáralo con lo que tienes y corrígelo si hay diferencias.
# =====================================================
# Práctica Unidad 1 - Programación Orientada a Objetos
# Asignatura: POO | UTH 2026-2
# Tema: Clases, Objetos, Atributos y Métodos
# =====================================================
class Estudiante:
"""Clase que representa a un estudiante de la UTH."""
# Atributo de clase (compartido por todos los objetos)
MINIMO_APROBATORIO = 7.0
def __init__(self, nombre, matricula, carrera, promedio=0.0):
"""Constructor: inicializa los atributos del estudiante."""
self.nombre = nombre
self.matricula = matricula
self.carrera = carrera
self.promedio = promedio
def mostrar_info(self):
"""Imprime en pantalla la información completa del estudiante."""
print("=" * 40)
print(f" FICHA DE ESTUDIANTE")
print("=" * 40)
print(f" Nombre : {self.nombre}")
print(f" Matrícula : {self.matricula}")
print(f" Carrera : {self.carrera}")
print(f" Promedio : {self.promedio:.1f}")
print("=" * 40)
def esta_aprobado(self):
"""Retorna True si promedio >= mínimo aprobatorio, False si no."""
return self.promedio >= Estudiante.MINIMO_APROBATORIO
def actualizar_promedio(self, nuevo_promedio):
"""Actualiza el promedio si el valor está en el rango correcto."""
if 0.0 <= nuevo_promedio <= 10.0:
self.promedio = nuevo_promedio
print(f"✅ Promedio actualizado a {nuevo_promedio:.1f}")
else:
print(f"❌ Error: el promedio debe estar entre 0.0 y 10.0")
def __str__(self):
"""Retorna representación en texto del objeto."""
estado = "✅ Aprobado" if self.esta_aprobado() else "❌ Reprobado"
return f"[{self.matricula}] {self.nombre} | Promedio: {self.promedio:.1f} | {estado}"
Ahora que tenemos la clase, vamos a instanciar (crear) objetos y llamar sus métodos. Escribe este código al final del mismo archivo, fuera de la clase (sin sangría).
if __name__ == "__main__":Este bloque especial permite que el código de prueba solo se ejecute cuando corres el archivo directamente, y NO cuando lo importas desde otro archivo. Es una buena práctica siempre incluirlo.
# =====================================================
# PROGRAMA PRINCIPAL — Aquí probamos la clase
# Este bloque solo se ejecuta al correr este archivo
# =====================================================
if __name__ == "__main__":
print("\n🎓 SISTEMA DE REGISTRO DE ESTUDIANTES — UTH")
print("=" * 50)
# ── Crear objetos (instanciar la clase) ──
# Sintaxis: variable = NombreClase(argumentos)
estudiante1 = Estudiante("Ana López", "DSM2024001", "DSM", 8.5)
estudiante2 = Estudiante("Carlos Mendoza", "DSM2024002", "DSM", 6.3)
estudiante3 = Estudiante("Lucia Torres", "TICS2024001", "TICS")
# ── Mostrar información de cada estudiante ──
print("\n📋 FICHAS DE ESTUDIANTES:")
estudiante1.mostrar_info()
estudiante2.mostrar_info()
# ── Verificar si están aprobados ──
print("\n📊 ESTADO ACADÉMICO:")
for est in [estudiante1, estudiante2, estudiante3]:
print(est) # llama a __str__ automáticamente
# ── Actualizar promedio ──
print("\n✏️ ACTUALIZAR PROMEDIOS:")
estudiante3.actualizar_promedio(7.8) # válido
estudiante2.actualizar_promedio(11.0) # inválido — prueba el error
# ── Estado final ──
print("\n📊 ESTADO FINAL:")
for est in [estudiante1, estudiante2, estudiante3]:
print(est)
# ── Acceder a atributos directamente ──
print(f"\n📌 Carrera de {estudiante1.nombre}: {estudiante1.carrera}")
print(f"📌 Mínimo aprobatorio: {Estudiante.MINIMO_APROBATORIO}")
| Línea clave | Explicación |
|---|---|
estudiante1 = Estudiante("Ana López", ...) |
Crea un objeto. Python llama automáticamente a __init__ con los argumentos que proporcionas. estudiante1 es la variable que guarda el objeto. |
estudiante1.mostrar_info() |
Llama al método mostrar_info del objeto estudiante1. Nota: NO escribes self al llamarlo — Python lo pasa automáticamente. |
for est in [estudiante1, estudiante2, estudiante3]: |
Recorre una lista de objetos. En cada iteración, est es un objeto diferente. |
print(est) |
Al imprimir un objeto directamente, Python llama automáticamente a su método __str__. |
Presiona Ctrl + S para guardar. El punto (•) que aparece en la pestaña del archivo desaparece cuando está guardado.
Ve al menú Terminal → New Terminal (o presiona Ctrl + ` — el acento grave). Se abrirá una terminal en la parte inferior de VS Code, ya ubicada en tu carpeta de trabajo.
En la parte inferior aparece una terminal. Deberías ver algo como: PS C:\...\Unidad1> o C:\...\Unidad1>
En la terminal, escribe el siguiente comando y presiona Enter:
python sistema_estudiantes.py
Si algo no funciona, revisa estos errores típicos:
| Error en pantalla | Causa probable | Solución |
|---|---|---|
IndentationError |
Falta sangría o la sangría no es consistente (mezcla de tabs y espacios) | En VS Code activa "Indent using Spaces" y usa siempre 4 espacios |
NameError: name 'Estudiante' is not defined |
Intentas usar la clase antes de definirla, o el nombre tiene un error tipográfico | Asegúrate de que la definición de la clase está ANTES del código que la usa |
TypeError: __init__() missing arguments |
Al crear el objeto no pasaste todos los argumentos requeridos | Revisa cuántos parámetros tiene __init__ y proporciona todos |
AttributeError: 'Estudiante' object has no attribute 'X' |
Intentas acceder a un atributo que no existe o lo escribiste diferente | Revisa que el nombre del atributo en self.X sea exactamente igual |
El archivo no ejecuta con python |
Python no está en el PATH del sistema | Prueba con python3 en lugar de python, o reinstala Python marcando "Add to PATH" |
¿Terminaste todo? ¡Demuestra que dominaste el tema con estos desafíos!
materias_inscritas (lista) al constructor. Crea un método inscribir_materia(nombre_materia) que añada una materia a la lista, y otro mostrar_materias() que las imprima.estudiante_con_mayor_promedio(lista_estudiantes) que reciba una lista de objetos Estudiante y retorne el que tenga el mayor promedio.reporte.py, impora la clase desde el primer archivo con from sistema_estudiantes import Estudiante y genera un reporte que liste todos los aprobados.Antes de entregar tu práctica, verifica que cumples con todo:
sistema_estudiantes.pyEstudiante con E mayúsculaMINIMO_APROBATORIO = 7.0__init__ inicializa los 4 atributosmostrar_info() imprime toda la informaciónesta_aprobado() retorna True o False correctamenteactualizar_promedio() valida el rango 0.0-10.0__str__ retorna la representación en textoEstudiante