Menu
Coddy logo textTech

Plateforme d'e-learning

Fait partie de la section Object Oriented Programming du Journey Python de Coddy — leçon 61 sur 64.

challenge icon

Défi

Difficile

Dans ce défi, vous allez implémenter un système de plateforme d'apprentissage en ligne orienté objet.

  • course.py - Implémentez la classe Course
  • student.py - Implémentez la classe Student
  • instructor.py - Implémentez la classe Instructor

Aide-mémoire

Cette leçon se concentre sur la mise en œuvre d'un système de plateforme d'apprentissage en ligne orienté objet avec trois classes principales :

  • Classe Course - Représente les cours éducatifs dans la plateforme
  • Classe Student - Représente les apprenants qui peuvent s'inscrire à des cours
  • Classe Instructor - Représente les enseignants qui peuvent créer et gérer des cours

Le système démontre les principes de la programmation orientée objet en modélisant des entités du monde réel sous forme de classes avec leurs propres propriétés et méthodes.

Essayez vous-même

from course import Course
from student import Student
from instructor import Instructor

# Gestionnaire de cas de test
test_case = input()

if test_case == "course_creation":
    # Test de la création de cours avec différentes capacités
    course1 = Course("Python 101", "Introduction to Python", 20)
    course2 = Course("Data Science", "Advanced data analysis techniques")
    
    print(f"Course 1: {course1.title}, Max Capacity: {course1.max_capacity}")
    print(f"Course 2: {course2.title}, Max Capacity: {course2.max_capacity}")
    print(f"Initial student count: {len(course1.students)}")

elif test_case == "student_enrollment":
    # Test du processus d'inscription des étudiants
    course = Course("Python 101", "Introduction to Python", 2)
    student1 = Student("Alice", "alice@example.com")
    student2 = Student("Bob", "bob@example.com")
    student3 = Student("Charlie", "charlie@example.com")
    
    # Inscrire les étudiants
    result1 = student1.enroll(course)
    result2 = student2.enroll(course)
    result3 = student3.enroll(course)  # Devrait échouer (capacité)
    
    print(f"Enrollment 1 result: {result1}")
    print(f"Enrollment 2 result: {result2}")
    print(f"Enrollment 3 result: {result3}")
    
    # Essayer d'inscrire le même étudiant deux fois
    result4 = student1.enroll(course)
    print(f"Re-enrollment result: {result4}")
    
    # Vérifier les états du cours et de l'étudiant
    print(f"Course has {len(course.students)} students")
    print(f"Student 1 has {len(student1.enrolled_courses)} enrolled courses")

elif test_case == "student_unenrollment":
    # Test du processus de désinscription des étudiants
    course = Course("Python 101", "Introduction to Python")
    student = Student("Alice", "alice@example.com")
    
    # Inscrire puis désinscrire
    student.enroll(course)
    print(f"Before unenroll: Course has {len(course.students)} students")
    print(f"Before unenroll: Student has {len(student.enrolled_courses)} courses")
    
    result = student.unenroll(course)
    print(f"Unenrollment result: {result}")
    
    print(f"After unenroll: Course has {len(course.students)} students")
    print(f"After unenroll: Student has {len(student.enrolled_courses)} courses")
    
    # Essayer de se désinscrire à nouveau
    result = student.unenroll(course)
    print(f"Second unenrollment result: {result}")

elif test_case == "course_completion":
    # Test du processus d'achèvement de cours
    course = Course("Python 101", "Introduction to Python")
    student = Student("Alice", "alice@example.com")
    
    # Inscrire et terminer
    student.enroll(course)
    print(f"Before completion: Enrolled in {len(student.enrolled_courses)} courses")
    print(f"Before completion: Completed {len(student.completed_courses)} courses")
    
    result = student.complete_course(course)
    print(f"Completion result: {result}")
    
    print(f"After completion: Enrolled in {len(student.enrolled_courses)} courses")
    print(f"After completion: Completed {len(student.completed_courses)} courses")
    
    # Vérifier l'état du cours
    print(f"Course has {len(course.students)} active students")
    print(f"Course has {len(course.completed_students)} completed students")

elif test_case == "instructor_assignment":
    # Test de l'affectation d'un instructeur
    course = Course("Python 101", "Introduction to Python")
    instructor = Instructor("Dr. Smith", "smith@example.edu", "Computer Science")
    
    print(f"Before assignment: Instructor has {len(instructor.courses)} courses")
    print(f"Before assignment: Course instructor is {course.instructor}")
    
    result = instructor.assign_to_course(course)
    print(f"Assignment result: {result}")
    
    print(f"After assignment: Instructor has {len(instructor.courses)} courses")
    print(f"After assignment: Course instructor is {course.instructor.name}")

elif test_case == "course_management":
    # Test de la gestion de la capacité des cours
    course = Course("Limited Course", "Test capacity", 2)
    student1 = Student("Alice", "alice@example.com")
    student2 = Student("Bob", "bob@example.com")
    student3 = Student("Charlie", "charlie@example.com")
    
    # Remplir le cours
    student1.enroll(course)
    student2.enroll(course)
    result = student3.enroll(course)  # Devrait échouer
    print(f"Enrolling to full course: {result}")
    
    # Faire de la place en se désinscrivant
    student1.unenroll(course)
    result = student3.enroll(course)  # Devrait réussir maintenant
    print(f"Enrolling after unenrollment: {result}")
    
    # Vérifier l'état final
    print(f"Final students in course: {len(course.students)}")
    print(f"Students are: {[s.name for s in course.students]}")

elif test_case == "integrated_test":
    # Test de l'ensemble du système fonctionnant ensemble
    # Créer des cours
    python_course = Course("Python 101", "Introduction to Python", 3)
    data_course = Course("Data Science", "Advanced data analysis", 2)
    
    # Créer des étudiants
    alice = Student("Alice", "alice@example.com")
    bob = Student("Bob", "bob@example.com")
    charlie = Student("Charlie", "charlie@example.com")
    
    # Créer un instructeur
    dr_smith = Instructor("Dr. Smith", "smith@example.edu", "Computer Science")
    
    # Affecter l'instructeur
    dr_smith.assign_to_course(python_course)
    dr_smith.assign_to_course(data_course)
    
    # Inscrire les étudiants
    alice.enroll(python_course)
    bob.enroll(python_course)
    charlie.enroll(python_course)
    
    alice.enroll(data_course)
    bob.enroll(data_course)  # Ceci remplit data_course
    
    # Terminer un cours
    alice.complete_course(python_course)
    
    # Afficher l'état du système
    print("System State:")
    print(f"Python course has {len(python_course.students)} active students and {len(python_course.completed_students)} completed")
    print(f"Data course has {len(data_course.students)} active students")
    print(f"Dr. Smith teaches {len(dr_smith.courses)} courses")
    print(f"Alice is enrolled in {len(alice.enrolled_courses)} courses and completed {len(alice.completed_courses)}")
    print(f"Charlie is enrolled in {len(charlie.enrolled_courses)} courses")

elif test_case == "edge_cases":
    # Test des cas limites
    course = Course("Small Course", "Test edge cases", 1)
    student1 = Student("Alice", "alice@example.com")
    student2 = Student("Bob", "bob@example.com")
    
    # Test d'inscription à la capacité exacte
    result1 = student1.enroll(course)
    result2 = student2.enroll(course)  # Devrait échouer
    print(f"Enrollment at capacity: {result1}")
    print(f"Enrollment beyond capacity: {result2}")
    
    # Test de l'achèvement d'un cours auquel l'étudiant n'est pas inscrit
    other_course = Course("Other Course", "Not enrolled")
    result3 = student1.complete_course(other_course)
    print(f"Complete non-enrolled course: {result3}")
    
    # Test de désinscription d'un cours auquel l'étudiant n'est pas inscrit
    result4 = student2.unenroll(course)
    print(f"Unenroll from non-enrolled course: {result4}")
    
    # Test de réaffectation d'un instructeur
    instructor1 = Instructor("Dr. Smith", "smith@example.edu", "Python")
    instructor2 = Instructor("Dr. Jones", "jones@example.edu", "Java")
    
    instructor1.assign_to_course(course)
    print(f"First instructor: {course.instructor.name}")
    
    instructor2.assign_to_course(course)
    print(f"After reassignment: {course.instructor.name}")

elif test_case == "capacity_limits":
    # Test des limites de capacité
    zero_capacity = Course("Empty Course", "No students allowed", 0)
    student = Student("Alice", "alice@example.com")
    
    result1 = student.enroll(zero_capacity)
    print(f"Enroll in zero-capacity course: {result1}")
    
    large_capacity = Course("Huge Course", "Many students", 1000)
    result2 = student.enroll(large_capacity)
    print(f"Enroll in large-capacity course: {result2}")
    print(f"Large course has capacity for {large_capacity.max_capacity} students")

elif test_case == "multiple_courses":
    # Test d'un étudiant avec plusieurs cours
    student = Student("Alice", "alice@example.com")
    course1 = Course("Python 101", "Intro to Python")
    course2 = Course("Java 101", "Intro to Java")
    course3 = Course("C++ 101", "Intro to C++")
    
    # S'inscrire à tous les cours
    student.enroll(course1)
    student.enroll(course2)
    student.enroll(course3)
    print(f"Enrolled in {len(student.enrolled_courses)} courses")
    
    # Terminer certains cours
    student.complete_course(course1)
    student.complete_course(course2)
    print(f"After completion: Enrolled in {len(student.enrolled_courses)} courses")
    print(f"After completion: Completed {len(student.completed_courses)} courses")
    
    # Vérifier les cours spécifiques
    enrolled_titles = [c.title for c in student.enrolled_courses]
    completed_titles = [c.title for c in student.completed_courses]
    print(f"Still enrolled in: {enrolled_titles}")
    print(f"Completed: {completed_titles}")

elif test_case == "instructor_workload":
    # Test d'un instructeur avec plusieurs cours
    instructor = Instructor("Dr. Smith", "smith@example.edu", ["Python", "Java", "C++"])
    course1 = Course("Python 101", "Intro to Python")
    course2 = Course("Java 101", "Intro to Java")
    course3 = Course("C++ 101", "Intro to C++")
    
    # Affecter à tous les cours
    instructor.assign_to_course(course1)
    instructor.assign_to_course(course2)
    instructor.assign_to_course(course3)
    
    print(f"Instructor teaches {len(instructor.courses)} courses")
    course_titles = [c.title for c in instructor.courses]
    print(f"Courses taught: {course_titles}")
    
    # Vérifier que l'instructeur est correctement affecté à chaque cours
    for i, course in enumerate([course1, course2, course3]):
        print(f"Course {i+1} instructor: {course.instructor.name}")

Toutes les leçons de Object Oriented Programming