Resumen - Sistema de registros de estudiantes
Parte de la sección Object Oriented Programming del Journey de Python de Coddy — lección 32 de 64.
Desafío
IntermedioEn este desafío, implementarás un sistema completo de gestión de expedientes de estudiantes.
Necesitas editar dos archivos para completar este desafío:
student.py- Implementa la claseStudentcon la encapsulación adecuadastudentregistry.py- Implementa la claseStudentRegistrypara gestionar a los estudiantes
Sigue los comentarios TODO detallados en cada archivo para obtener una guía paso a paso. Tu implementación será probada con casos de prueba exhaustivos que verifican:
- Validación adecuada de atributos y manejo de errores
- Cálculo correcto de los promedios de calificaciones
- Funcionalidad del registro con varios escenarios de estudiantes
- Condiciones de límite y casos de borde
Hoja de referencia
Este desafío se centra en la implementación de un sistema completo de gestión de expedientes de estudiantes utilizando principios de programación orientada a objetos con una encapsulación y validación adecuadas.
El sistema consta de dos componentes principales:
- Clase Student - Gestiona los datos individuales de los estudiantes con una encapsulación adecuada
- Clase StudentRegistry - Gestiona colecciones de estudiantes
Los requisitos clave de implementación incluyen:
- Validación adecuada de atributos y manejo de errores
- Cálculo correcto de los promedios de calificaciones
- Funcionalidad de registro para gestionar múltiples estudiantes
- Manejo de condiciones de contorno y casos de borde
Pruébalo tú mismo
from student import Student
from studentregistry import StudentRegistry
import time
import random
# Manejador de casos de prueba para pruebas exhaustivas
test_case = input()
if test_case == "default_test":
# Crear estudiantes
student1 = Student(1001, "Alice Smith")
student2 = Student(1002, "Bob Johnson")
student3 = Student(1003, "Charlie Brown")
# Agregar calificaciones
student1.add_grade("Math", 90)
student1.add_grade("Science", 85)
student1.add_grade("English", 92)
student2.add_grade("Math", 78)
student2.add_grade("Science", 80)
student2.add_grade("English", 85)
student3.add_grade("Math", 95)
student3.add_grade("Science", 91)
student3.add_grade("English", 89)
# Mostrar registros de estudiantes
print("Student Records:")
student1.display_record()
print()
student2.display_record()
print()
student3.display_record()
print()
# Probar validación de nombre
try:
student1.name = "J" # Demasiado corto
except ValueError as e:
print(f"Name validation error: {e}")
print()
# Crear registro y agregar estudiantes
registry = StudentRegistry()
registry.add_student(student1)
registry.add_student(student2)
registry.add_student(student3)
# Mostrar todos los estudiantes
print("All Students in Registry:")
registry.display_all()
print()
# Obtener al mejor estudiante
top_student = registry.get_top_student()
print(f"Top Student: {top_student.name} (Average: {top_student.grade_average})")
# Eliminar un estudiante
registry.remove_student(1002) # Eliminar a Bob
print("\
After removing student 1002:")
registry.display_all()
elif test_case == "empty_registry":
# Probar un registro vacío
registry = StudentRegistry()
top_student = registry.get_top_student()
if top_student is None:
print("Top student in empty registry: None")
print("Displaying all students in empty registry:")
registry.display_all() # No debería mostrar nada
elif test_case == "validation_tests":
# Probar todas las reglas de validación
student = Student(1001, "Valid Name")
print(f"Created student with name: {student.name}")
# Probar nombre vacío
try:
student.name = ""
except ValueError as e:
print(f"Empty name test: {e}")
# Probar nombre de un solo carácter
try:
student.name = "A"
except ValueError as e:
print(f"Single character name test: {e}")
# Probar valor de inscripción no booleano
try:
student.enrolled = "yes"
except ValueError as e:
print(f"Non-boolean enrolled test: {e}")
# Probar cambios válidos
student.name = "New Valid Name"
student.enrolled = False
print(f"After valid changes - Name: {student.name}, Enrolled: {student.enrolled}")
elif test_case == "grade_calculation":
# Probar el cálculo del promedio de calificaciones
student = Student(1001, "Test Student")
print(f"Student with no grades - Average: {student.grade_average}")
# Agregar una calificación
student.add_grade("Math", 85)
print(f"Student with one grade - Average: {student.grade_average}")
# Agregar más calificaciones
student.add_grade("Science", 90)
student.add_grade("English", 95)
print(f"Student with multiple grades - Average: {student.grade_average}")
elif test_case == "registry_operations":
# Probar todas las operaciones del registro
registry = StudentRegistry()
# Crear estudiantes
student1 = Student(101, "Student One")
student2 = Student(102, "Student Two")
# Agregar estudiantes
registry.add_student(student1)
registry.add_student(student2)
print("After adding students:")
registry.display_all()
# Obtener estudiante
retrieved_student = registry.get_student(101)
print(f"\
Retrieved student 101: {retrieved_student.name if retrieved_student else None}")
# Obtener estudiante inexistente
non_existent = registry.get_student(999)
print(f"Retrieved student 999: {non_existent}")
# Eliminar estudiante
registry.remove_student(101)
print("\
After removing student 101:")
registry.display_all()
# Eliminar estudiante inexistente (no debería generar error)
registry.remove_student(999)
print("\
After attempting to remove non-existent student 999:")
registry.display_all()
elif test_case == "large_registry":
# Probar el rendimiento con muchos estudiantes
start_time = time.time()
registry = StudentRegistry()
# Crear 100 estudiantes con calificaciones aleatorias
for i in range(1, 101):
student = Student(1000 + i, f"Student {i}")
# Agregar 5 calificaciones aleatorias
for j in range(5):
student.add_grade(f"Course {j+1}", random.randint(60, 100))
registry.add_student(student)
creation_time = time.time() - start_time
print(f"Time to create 100 students: {creation_time:.4f} seconds")
# Encontrar al mejor estudiante
start_time = time.time()
top_student = registry.get_top_student()
top_time = time.time() - start_time
print(f"Time to find top student: {top_time:.4f} seconds")
print(f"Top student: {top_student.name} with average {top_student.grade_average:.2f}")
# Encontrar los 5 mejores estudiantes manualmente
print("\
Top 5 students:")
students_list = []
for i in range(1, 101):
student = registry.get_student(1000 + i)
students_list.append(student)
# Ordenar por promedio de calificaciones en orden descendente
students_list.sort(key=lambda s: s.grade_average, reverse=True)
# Mostrar los 5 mejores
for i in range(5):
student = students_list[i]
print(f"{i+1}. {student.name}: {student.grade_average:.2f}")Todas las lecciones de Object Oriented Programming
1Fundamentos de la POO
Archivos externosIntroducción a la POOClases vs ObjetosEl parámetro selfMétodosAtributosMétodo constructor (__init__)Resumen - Calculadora simple4Herencia
Herencia básicaLa función super()Sobrescritura de métodosHerencia múltipleOrden de resolución de métodosResumen - Jerarquía de empleados7Métodos especiales
Introducción a los métodos mágicosSobrecarga de operadoresMétodos mágicos de contenedoresRepaso - Lista personalizada10Patrones de diseño Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón Strategy2Decoradores
Introducción a los decoradoresDecorador propertyDecorador de métodos estáticosDecorador de métodos de clase5Polimorfismo
Sobreescritura de métodos revisitadaDuck TypingClases y métodos abstractosDiseño de interfacesResumen - Calculadora de figuras8Conceptos avanzados de POO
Composición vs. HerenciaMixinsMétodos estáticos y de claseDecoradores de claseGestores de contexto11Patrones de diseño, parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón Composite3Propiedades de clase
Variables de instancia vs de claseDecoradores de propiedadesAtributos privadosResumen - Gestor de cuentas bancarias6Encapsulamiento
Miembros públicos, protegidos y privadosModificadores de accesoOcultamiento de informaciónDecoradores de propiedades avanzadosResumen - Sistema de registros de estudiantes