Repaso: sistema de registros de estudiantes
Parte de la sección Programación orientada a objetos 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.
Debes editar dos archivos para completar este desafío:
student.py- Implementa la claseStudentcon la encapsulación adecuadastudentregistry.py- Implementa la claseStudentRegistrypara gestionar estudiantes
Sigue los comentarios detallados TODO de cada archivo para obtener instrucciones paso a paso. Tu implementación se probará con casos de prueba exhaustivos que verifican:
- La validación adecuada de atributos y el manejo de errores
- El cálculo correcto de los promedios de calificaciones
- La funcionalidad del registro con distintos casos de estudiantes
- Las condiciones límite y los casos extremos
Pruébalo tú mismo
from student import Student
from studentregistry import StudentRegistry
import time
import random
# Gestor de casos de prueba para realizar 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")
# Añadir 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 los registros de los estudiantes
print("Student Records:")
student1.display_record()
print()
student2.display_record()
print()
student3.display_record()
print()
# Probar la validación del nombre
try:
student1.name = "J" # Demasiado corto
except ValueError as e:
print(f"Name validation error: {e}")
print()
# Crear un registro y añadir 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 el estudiante con mejor promedio
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":
# Prueba todas las reglas de validación
student = Student(1001, "Valid Name")
print(f"Created student with name: {student.name}")
# Prueba un nombre vacío
try:
student.name = ""
except ValueError as e:
print(f"Empty name test: {e}")
# Prueba un nombre de un solo carácter
try:
student.name = "A"
except ValueError as e:
print(f"Single character name test: {e}")
# Prueba un valor no booleano para enrolled
try:
student.enrolled = "yes"
except ValueError as e:
print(f"Non-boolean enrolled test: {e}")
# Prueba los 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":
# Prueba el cálculo del promedio de calificaciones
student = Student(1001, "Test Student")
print(f"Student with no grades - Average: {student.grade_average}")
# Añade una calificación
student.add_grade("Math", 85)
print(f"Student with one grade - Average: {student.grade_average}")
# Añade 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":
# Prueba todas las operaciones del registro
registry = StudentRegistry()
# Crear estudiantes
student1 = Student(101, "Student One")
student2 = Student(102, "Student Two")
# Añade estudiantes
registry.add_student(student1)
registry.add_student(student2)
print("After adding students:")
registry.display_all()
# Obtén un estudiante
retrieved_student = registry.get_student(101)
print(f"\
Retrieved student 101: {retrieved_student.name if retrieved_student else None}")
# Obtener un estudiante que no existe
non_existent = registry.get_student(999)
print(f"Retrieved student 999: {non_existent}")
# Eliminar un estudiante
registry.remove_student(101)
print("\
After removing student 101:")
registry.display_all()
# Eliminar un estudiante que no existe (no debería generar un 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 estudiante con el mejor promedio
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 manualmente a los 5 estudiantes con los mejores promedios
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 a los 5 estudiantes con los mejores promedios
for i in range(5):
student = students_list[i]
print(f"{i+1}. {student.name}: {student.grade_average:.2f}")Todas las lecciones de Programación orientada a objetos
1Fundamentos de la POO
Introducción a la POOArchivos externosClases vs. objetosEl parámetro selfMétodosAtributosMétodo constructor (__init__)Repaso: calculadora sencilla4Herencia
Herencia básicaLa función super()Sobrescritura de métodosHerencia múltipleOrden de resolución de métodosRepaso: 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 de propiedadDecorador de método estáticoDecorador de método de clase5Polimorfismo
Repaso de la sobrescritura de métodosTipado patoClases y métodos abstractosDiseño de interfacesRepaso: calculadora de formas8Conceptos avanzados de POO
Composición frente a 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. variables de claseDecoradores de propiedadesAtributos privadosRepaso: gestor de cuentas bancarias6Encapsulamiento
Miembros públicos, protegidos y privadosModificadores de accesoOcultación de informaciónDecoradores de propiedades avanzadosRepaso: sistema de registros de estudiantesPractica por tu cuenta: Compilador de Python online