Exercice 24
Objectif
Développer un programme de gestion de denrées alimentaires en appliquant les notions de programmation orientée objet, en particulier l'héritage et l'encapsulation.
Contexte
Un commerce alimentaire veut automatiser son suivi de stock. Il propose deux gammes d'articles : des produits classiques et des produits périssables (comme les fruits ou les laitages). Vous devez concevoir une structure de classes pour représenter ces produits.
Instructions
1. Classe de base : Produit
Concevez une classe Produit répondant aux spécifications suivantes :
Attributs privés :
- _nom : chaîne de caractères (désignation du produit)
- _prix : nombre décimal (valeur unitaire en euros)
- _stock : nombre entier (quantité disponible)
Méthodes :
- Constructeur __init__(self, nom, prix, stock) initialisant les trois attributs
- afficher_infos(self) : méthode formatant et affichant toutes les données du produit
- Accesseurs et mutateurs pour chaque attribut (exemples : get_nom(), set_nom())
2. Classe dérivée : ProduitPerissable
Concevez une classe ProduitPerissable qui dérive de la classe Produit.
Attribut supplémentaire privé :
- _date_expiration : chaîne de caractères pour la date de péremption (au format "JJ/MM/AAAA")
Méthodes :
- Constructeur acceptant les paramètres nom, prix, stock et date_expiration, et invoquant le constructeur parent
- afficher_expiration(self) : méthode affichant uniquement la date de péremption
- Accesseurs et mutateurs pour l'attribut _date_expiration
3. Programme de test à implémenter
Dans le bloc principal (if __name__ == "__main__"), codez un programme effectuant les étapes ci-dessous :
- Instanciez un produit périssable avec ces valeurs :
- Nom : "Yaourt nature"
- Prix : 2.50
- Stock : 15 unités
- Date d'expiration : "15/05/2024"
- Affichez les données initiales de l'objet :
- Présentez toutes ses informations (nom, prix, stock)
- Affichez sa date d'expiration de manière distincte
- Modifiez ses caractéristiques via les mutateurs :
- Nouveau prix : 2.75 euros
- Nouveau stock : 20 unités
- Nouvelle date d'expiration : "20/05/2024"
- Visualisez à nouveau les informations pour confirmer la prise en compte des changements
Contraintes techniques
- Tous les attributs doivent rester privés (avec le préfixe _)
- Les interactions avec les attributs se font uniquement par les accesseurs et mutateurs
- La classe ProduitPerissable doit étendre correctement les capacités de Produit
- Le code doit être lisible, correctement indenté et annoté si besoin
Résultat attendu
À l'exécution du programme, vous devriez obtenir un affichage similaire à :
|
1 2 3 4 5 6 7 |
=== Affichage initial === Nom: Yaourt nature, Prix: 2.5€, Stock: 15 unités Date d'expiration : 15/05/2024 === Après modifications === Nom: Yaourt nature, Prix: 2.75€, Stock: 20 unités Date d'expiration : 20/05/2024 |
Solution
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
""" TP 5 : Système de gestion de produits avec héritage et encapsulation Classe Produit de base et classe ProduitPerissable dérivée """ class Produit: """Classe de base représentant un produit générique""" def __init__(self, nom, prix, stock): """Constructeur - initialise les attributs privés""" self._nom = nom # Attribut privé pour le nom self._prix = prix # Attribut privé pour le prix self._stock = stock # Attribut privé pour le stock # --- Getters (accesseurs) --- def get_nom(self): """Retourne le nom du produit""" return self._nom def get_prix(self): """Retourne le prix du produit""" return self._prix def get_stock(self): """Retourne le stock du produit""" return self._stock # --- Setters (mutateurs) --- def set_nom(self, nouveau_nom): """Modifie le nom du produit""" self._nom = nouveau_nom def set_prix(self, nouveau_prix): """Modifie le prix du produit""" self._prix = nouveau_prix def set_stock(self, nouveau_stock): """Modifie le stock du produit""" self._stock = nouveau_stock def afficher_infos(self): """Affiche toutes les informations du produit""" # Utilise les getters pour récupérer les valeurs print(f"Nom: {self.get_nom()}, Prix: {self.get_prix()}€, Stock: {self.get_stock()} unités") class ProduitPerissable(Produit): """Classe dérivée représentant un produit périssable""" def __init__(self, nom, prix, stock, date_expiration): """ Constructeur - appelle d'abord le constructeur parent puis initialise l'attribut spécifique """ super().__init__(nom, prix, stock) # Appel au constructeur de Produit self._date_expiration = date_expiration # Attribut spécifique # --- Getters et setters spécifiques --- def get_date_expiration(self): """Retourne la date d'expiration""" return self._date_expiration def set_date_expiration(self, nouvelle_date): """Modifie la date d'expiration""" self._date_expiration = nouvelle_date def afficher_expiration(self): """Affiche spécifiquement la date d'expiration""" print(f"Date d'expiration : {self.get_date_expiration()}") # --- Programme principal de test --- if __name__ == "__main__": print("=== TP 5 : Gestion de produits périssables ===") print() # 1. Création d'un produit périssable print("1. Création d'un produit périssable...") yaourt = ProduitPerissable( nom="Yaourt nature", prix=2.50, stock=15, date_expiration="15/05/2024" ) # 2. Affichage initial print("\n2. Affichage des informations initiales :") print("-" * 40) yaourt.afficher_infos() # Méthode héritée de Produit yaourt.afficher_expiration() # Méthode spécifique à ProduitPerissable # 3. Modifications via les setters print("\n3. Modification des attributs via les setters...") yaourt.set_prix(2.75) # Modification du prix yaourt.set_stock(20) # Modification du stock yaourt.set_date_expiration("20/05/2024") # Modification de la date # 4. Affichage final print("\n4. Affichage après modifications :") print("-" * 40) yaourt.afficher_infos() yaourt.afficher_expiration() print("\n=== Fin du programme ===") |
Output:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
=== TP 5 : Gestion de produits périssables === 1. Création d'un produit périssable... 2. Affichage des informations initiales : ---------------------------------------- Nom: Yaourt nature, Prix: 2.5€, Stock: 15 unités Date d'expiration : 15/05/2024 3. Modification des attributs via les setters... 4. Affichage après modifications : ---------------------------------------- Nom: Yaourt nature, Prix: 2.75€, Stock: 20 unités Date d'expiration : 20/05/2024 === Fin du programme === |
Auteur : Younes Derfoufi
Lieu de travail : CRMEF OUJDA
Site Web : www.tresfacile.net
Chaine YouTube : https://www.youtube.com/user/InformatiquesFacile
Me contacter : https://www.tresfacile.net/me-contacter/



