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
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 estudiantesPractica por tu cuenta: Compilador de Python online