<string>

Table des matières

Mission 10 - Polymorphisme

Mission 10

Mission 10

1   Introduction

1.1   Objectifs

Dans cette mission, vous allez approfondir votre compréhension des concepts fondamentaux de la programmation orientée objet en Python. L’objectif est de consolider les compétences acquises dans les missions précédentes tout en explorant de nouvelles notions clés :

  • Conception de classes et d’objets : apprendre à définir des classes, créer des instances et gérer leurs attributs et méthodes.
  • Héritage : comprendre comment factoriser le code commun dans une classe mère et, si nécessaire, étendre ou spécialiser le comportement dans les sous-classes.
  • Redéfinition de méthodes : maîtriser la surcharge et la personnalisation des méthodes pour adapter leur comportement selon le type d’objet.
  • Polymorphisme : découvrir comment invoquer des méthodes de manière uniforme tout en laissant chaque sous-classe gérer ses spécificités.
  • Liaison dynamique : comprendre le mécanisme qui permet à Python de déterminer, au moment de l’exécution, quelle méthode appeler.
  • Utilisation de ``self`` et ``super()`` : savoir combiner le comportement générique de la classe mère avec les fonctionnalités propres aux sous-classes.

1.2   Préparation, étude et apprentissage

Si vous n'avez pas encore eu le temps de relire en détail les différents chapitres de la partie Objects du syllabus en ligne, maintenant est venu le moment de rattraper votre retard. Le syllabus explique bien différents concepts, sur un autre exemple que les exemples utilisés dans le cours magistral :

On vous conseille également de tester et de jouer avec les différents exemples de code qui se trouvent dans les annexes suivantes, venant soit du syllabus en ligne soit correspondant aux exemples du cours magistral :

2   Questionnaire de démarrage

2.1   Questions à choix multiple


        
        

2.2   Questions ouvertes

2.2.1   Énergie


        
        

2.2.2   Boite et Texte


        
        

2.2.3   Cartes Bancaires


        
        

2.2.4   Centre d'expédition d'Amazon


        
        

Mission 10 : Polymorphisme

Mission 10 : Polymorphisme

1   Description et objectifs

Dans la mission précédente, vous avez créé et utilisé des classes représentant différents types de médias (LivreAudio, Vidéo, ...), qui sont des sous-classes de la classe Media, ainsi qu’une classe ListeLecture pour les organiser. Dans cette nouvelle mission, vous allez implémenter la fonctionnalité de sauvegarde de vos médias et de vos listes de lecture dans des fichiers texte. Vous travaillerez à la fois sur l’héritage et la réutilisation du code dans la classe mère, tout en approfondissant le concept de polymorphisme : une même méthode pouvant être appelée sur des objets de types différents et produisant un comportement spécifique à chaque type d’objet.

2   Rappel des classes

Vous disposez déjà des classes suivantes :

  • Duree : représente une durée sous le format hh:mm:ss.
  • Media : classe mère représentant un média générique. Elle contient les attributs titre, auteur, duree ainsi que les méthodes taille(), taille_par_seconde() et type_media().
  • LivreAudio : sous-classe de Media. Elle ajoute l’attribut editeur. La méthode save() (permettant de sauvegarder ce type de média) y est déjà implémentée comme exemple.
  • ListeLecture : représente une playlist nommée contenant plusieurs médias.
  • Video : sous-classe de Media. Elle ajoute l’attribut supplémentaire resolution.

Votre fichier mission10.py doit inclure :

  • Les classes ci-dessus, toutes modifiées pour intégrer la méthode save().

3   La méthode save()

La méthode save() doit permettre de sauvegarder les informations d’un média dans un fichier texte. Le fichier doit être nommé selon le format : auteur_titre_typeMedia.txt et contenir les noms des attributs du média ainsi que leurs valeurs.

Exemple attendu pour LivreAudio:

Nom du fichier : "Cube Kid_Journal d'un noob (tome 1)_LivreAudio.txt"

Contenu du fichier:
    Titre : Journal d'un noob (tome 1)
    Auteur : Cube Kid
    Durée : 02:36:21
    Editeur : 404 Éditions

Exemple attendu pour Video :

Nom du fichier : "LeCrafteur_Tuto installation Minecraft_Video.txt"

Contenu du fichier:
    Titre : Tuto installation Minecraft
    Auteur : LeCrafteur
    Durée : 00:10:01
    Resolution : 720p

Vous devez également implémenter la méthode save() dans la classe ListeLecture. Cette méthode doit sauvegarder tous les médias contenus dans la liste, en appelant leur propre méthode save() un par un.

Enfin, dans tous les cas, si un fichier portant le même nom existe déjà, la sauvegarde de ce fichier ne se fera pas.

4   Étapes à suivre

  1. Prenez connaissance du fichier mission10.py et examinez la méthode save() déjà implémentée dans la classe LivreAudio.

  2. Ajoutez la méthode save() également dans la classe Video.

  3. Analysez en détail ce que les méthodes save() des classes LivreAudio et Video ont en commun.

  4. Utilisez le concept d'héritage pour déplacer cette partie commune dans une méthode save() la classe mère Media, afin d'éviter la duplication de code des méthodes save() dans les sous-classes. Astuce :
    • Dans la méthode save() de la classe mère, crééz le fichier et sauvegardez les attributs communs à tous les médias.

    • Dans chaque sous-classe, rouvrez le fichier pour y ajouter les atttributs spécifiques à ce type de média.

    • Pour rouvrir un fichier sans écraser son contenu, utilisez :

      open(nom_fichier, "a")  # mode Append

      plutôt que :

      open(nom_fichier, "w")  # mode Write

      car le mode "w" écrase le contenu existant.

  5. Vérifiez le bon fonctionnement de votre implémentation en créant un fichier test.py qui teste :
    • La création des fichiers.
    • Que les fichiers créés portent les noms corrects.
    • Que le contenu des fichiers correspond aux spécifications.

5   Remise

Pour cette mission, vous devez soumettre les fichiers suivants :

  • mission10.py : vos classes complètes avec la méthode save() ajouté.
  • test.py : script de test montrant que save() fonctionne pour tous les types de médias.
  • README.txt : instructions pour exécuter votre code et tester la sauvegarde.

Bonnes pratiques :

  • Factorisez le code autant que possible pour éviter les duplications.
  • Utilisez les fonctionnalités de l’héritage et super() à bon escient.
  • Nommez vos fichiers et vos variables de manière claire et cohérente.

        
        
Questions complémentaires

Questions complémentaires

Héritage