Apprenez en lisant dans l'ordre

Exercices de récap de la POO Python — Mets en code ce que tu as appris

Quatre exercices qui rassemblent ce que tu as appris dans la POO Python — définitions de classes avec méthodes spéciales, héritage, encapsulation et polymorphisme. Écris du code, exécute-le et révise tout le chapitre d'un coup.

Problème 1 : concevoir une classe Point avec des méthodes spéciales

Construis une classe Point qui représente une coordonnée 2D. Tu vas initialiser les attributs dans __init__, définir ce que fait + entre deux points avec __add__, et façonner ce qu'affiche print() avec __str__ — trois méthodes spéciales qui travaillent ensemble.

Comment les trois méthodes spéciales se déclenchent dans l'ordre
Point(1, 2)__init__: self.x=1, self.y=2p1 + p2__add__: retourne Point(4, 6)print(p1 + p2)__str__: "(4, 6)"+print
__init__ fixe les attributs → __add__ retourne une nouvelle instance → __str__ formate la chaîne — chacune est appelée à son tour.

Écris une classe Point qui contient une coordonnée x et une coordonnée y.

Conçois-la pour qu'appeler print(Point(1, 2) + Point(3, 4)) affiche (4, 6) à l'écran.

Éditeur Python

Exécuter le code pour voir le résultat

Problème 2 : étendre un compte bancaire avec l'héritage et super()

Hérite d'une classe parente BankAccount pour construire un SavingsAccount qui peut appliquer des intérêts. Le motif est l'héritage classique : appelle l'initialiseur du parent avec super().__init__(...), puis ajoute par-dessus les attributs spécifiques à l'enfant.

Appelle super() pour réutiliser le __init__ du parent, puis ajoute le tien
BankAccount (parent)name / balanceSavingsAccount (enfant)name / balance / rate__init__self.name, self.balance__init__super().__init__(...)ajoute self.rateapply_interest()balance += balance * ratehériteappel superétend
Appeler super().__init__(...) depuis le __init__ de l'enfant te permet de réutiliser la mise en place du parent et de n'ajouter que les nouveautés de l'enfant.

Écris une classe SavingsAccount qui hérite de BankAccount. En plus du name et du balance du parent, SavingsAccount porte un taux d'intérêt rate.

Ajoute une méthode apply_interest() qui ajoute les intérêts (balance × rate, tronqués en entier) au solde courant. Construis SavingsAccount("Alice", 100000, 0.05), appelle apply_interest(), et conçois la classe pour que print() affiche Alice: 105000.

Éditeur Python

Exécuter le code pour voir le résultat

Problème 3 : valider une température avec @property

Écris une classe Celsius qui rejette les affectations en dessous du zéro absolu (-273.15). Tu vas utiliser @property et un @value.setter pour insérer la validation directement dans l'affectation d'attribut — c'est le motif d'encapsulation classique.

Le setter valide chaque affectation
Celsius(25)self.value = 25 → settert.value = -300réaffectation → setter25 >= -273.15validation réussie-300 < -273.15validation échouéeself._value = 25stockéraise ValueErrorexception
t.value = X a l'air d'une simple affectation, mais passe par le setter, qui valide la valeur d'abord. Hors plage → ValueError, dans la plage → stockage dans _value.

Écris une classe Celsius avec un attribut value qui lève ValueError("Température sous le zéro absolu non autorisée") quand on essaie d'affecter quelque chose de strictement inférieur à -273.15.

Construis Celsius(25) et affiche la température, puis enveloppe une affectation t.value = -300 dans un try / except et affiche le message d'erreur sous la forme Erreur : ....

Éditeur Python

Exécuter le code pour voir le résultat

Problème 4 : utiliser le polymorphisme pour calculer les aires en une boucle

Donne à deux classes différentes une méthode du même nom (area()), mets leurs instances dans une liste, et traite-les avec une seule boucle for. L'appelant ne se soucie pas de quelle classe est laquelle — c'est le polymorphisme en résumé.

Même nom de méthode, comportement différent par type
Rectanglewidth × heightliste shapes[Rectangle, Circle]Circleπ × radius²Rectangle.area()= w × hfor shape in shapes:shape.area()Circle.area()= π × r²forsi Rectanglesi Circle
Quand tu appelles shape.area() sur chaque élément de la liste, la méthode correspondant au type réel de l'élément est choisie automatiquement.

Écris deux classes, Rectangle(width, height) et Circle(radius), toutes deux avec une méthode area() qui retourne l'aire. Rectangle calcule largeur × hauteur et Circle calcule π × rayon au carré.

Mets Rectangle(3, 4) et Circle(5) dans une liste, parcours-la et affiche chaque aire au format Aire : 12.00 — formatée avec deux décimales. Utilise math.pi pour π.

Éditeur Python

Exécuter le code pour voir le résultat

Bravo d'avoir tenu jusqu'ici

Cela conclut la POO Python. Tu as couvert la conception de classes et d'instances, les méthodes spéciales comme __init__ / __add__ / __str__, l'héritage avec super(), l'encapsulation avec @property, le polymorphisme, l'instruction with et les annotations de type — à peu près tous les outils dont tu as besoin pour regrouper données et comportement dans un seul type. Tu peux maintenant définir tes propres types, leur attacher des méthodes et traiter plusieurs types via une interface partagée.

Le chapitre suivant, Python Intermédiaire, va au-delà d'un seul fichier : organiser modules et packages, et utiliser la bibliothèque standarddatetime, os, re, json, collections, dataclasses, asyncio et plus encore — pour construire le genre de traitements que tu rencontreras réellement en production.