Plateforme d'e-learning
Fait partie de la section Object Oriented Programming du Journey Python de Coddy — leçon 61 sur 64.
Défi
DifficileDans ce défi, vous allez implémenter un système de plateforme d'apprentissage en ligne orienté objet.
course.py- Implémentez la classeCoursestudent.py- Implémentez la classeStudentinstructor.py- Implémentez la classeInstructor
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
1Les fondamentaux de la POO
Fichiers externesIntroduction à la POOClasses vs ObjetsLe paramètre selfMéthodesAttributsMéthode constructeur (__init__)Récapitulatif - Calculatrice simple4Héritage
Héritage de baseLa fonction super()Redéfinition de méthodeHéritage multipleOrdre de résolution des méthodesRécapitulatif - Hiérarchie des employés7Méthodes spéciales
Introduction aux méthodes magiquesSurcharge d'opérateursMéthodes magiques de conteneurRécapitulatif - Liste personnalisée10Patrons de conception, Partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FactoryPatron ObserverPatron Strategy13Défis finaux
Plateforme d'e-learningSystème bancaireDéveloppement de personnages de jeuService de location de véhicules2Décorateurs
Introduction aux décorateursDécorateur de propriétéDécorateur de méthode statiqueDécorateur de méthode de classe5Polymorphisme
Retour sur la redéfinition de méthodeDuck TypingClasses et méthodes abstraitesConception d'interfacesRécapitulatif - Calculateur de formes8Concepts avancés de la POO
Composition vs HéritageMixinsMéthodes statiques et de classeDécorateurs de classeGestionnaires de contexte11Patrons de conception, Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode TemplatePatron ÉtatPatron Composite3Propriétés de classe
Variables d'instance vs variables de classeDécorateurs de propriétéAttributs privésRécapitulatif - Gestionnaire de compte bancaire