Le moule à gâteaux
Le moule (la classe) donne la forme. Chaque gâteau (objet) sort du même moule, mais on peut choisir sa garniture : chocolat, amandes, dattes. Le constructeur, c'est le moment où l'on remplit le moule.
Écrire une classe Python avec son constructeur __init__, ses attributs d'instance et ses attributs de classe, et savoir à quoi sert le destructeur.
L'auto-école veut passer à la POO. Première étape : décrire ce qu'est un élève. Chaque élève a un nom, un âge et un nombre d'heures de conduite, qui commence à zéro. L'auto-école veut aussi savoir combien d'élèves ont été inscrits au total. Tout cela s'écrit dans une classe.
La classe Eleve décrit le modèle : chaque élève aura un nom, un âge et des heures. Aucun élève n'existe encore.
Une classe se définit avec le mot-clé class. Par convention, son nom commence par une majuscule.
class Eleve:
def __init__(self, nom, age):
self.nom = nom
self.age = age
self.heures = 0
__init__Quand on écrit Eleve("Salma", 19), Python crée un objet vide puis appelle __init__ pour le remplir. Le premier paramètre, self, désigne l’objet en cours de création. self.nom = nom signifie : « range la valeur reçue dans l’attribut nom de cet objet ».
Un constructeur peut avoir des valeurs par défaut (def __init__(self, nom, ville="Meknès")) : c’est la façon Python d’offrir plusieurs manières de construire un objet.
| Composante | En Python | Exemple |
|---|---|---|
| attribut d’instance | self.x dans __init__ | self.nom |
| attribut de classe | variable écrite dans la classe | nb_inscrits = 0 |
| constructeur | __init__ | initialise les attributs |
| destructeur | __del__ | appelé quand l’objet disparaît |
| méthode | def dans la classe | ajouter_heure(self) |
Python ne déclare pas le type des attributs, mais on peut l’indiquer avec des annotations : self.age: int = age. La visibilité se marque par le nom : nom est public, _nom est protégé (convention), __nom est privé. On y revient dans la leçon sur l’encapsulation.
__del__ est appelé quand plus rien ne référence l’objet. En Python, c’est le ramasse-miettes (garbage collector) qui libère la mémoire : on écrit rarement un destructeur, sauf pour fermer une ressource (fichier, connexion).
Le moule (la classe) donne la forme. Chaque gâteau (objet) sort du même moule, mais on peut choisir sa garniture : chocolat, amandes, dattes. Le constructeur, c'est le moment où l'on remplit le moule.
À la boulangerie, chaque client reçoit son propre numéro, mais le compteur est partagé par tous. Le numéro est un attribut d'instance ; le compteur est un attribut de classe.
class Ticket: compteur = 0 # partagé par tous def __init__(self): Ticket.compteur += 1 self.numero = Ticket.compteur # propre à chaque ticket
Exécutez le code : les objets et leurs attributs s'afficheront ici.
Écrivez une classe Produit avec un constructeur qui reçoit un nom et un prix, et un attribut quantite qui vaut 0 au départ. Créez deux produits et affichez-les.
class Produit: def __init__(self, nom, prix): self.nom = nom self.prix = prix self.quantite = 0 lait = Produit("Lait 1L", 7.5) pain = Produit("Pain", 1.2) print(lait.nom, lait.prix, lait.quantite) print(pain.nom, pain.prix, pain.quantite)
Modifiez le constructeur pour que la ville d'un élève vaille « Meknès » si on ne la donne pas.
Un paramètre peut avoir une valeur par défaut : def __init__(self, nom, ville=...).
class Eleve: def __init__(self, nom, ville="Meknès"): self.nom = nom self.ville = ville a = Eleve("Salma") b = Eleve("Karim", "Fès") print(a.ville, b.ville) # Meknès Fès
Ajoutez à la classe Produit un attribut de classe nb_produits qui compte les produits créés.
class Produit: nb_produits = 0 def __init__(self, nom, prix): self.nom = nom self.prix = prix Produit.nb_produits += 1 Produit("Lait", 7.5) Produit("Pain", 1.2) print(Produit.nb_produits) # 2