Aller au contenu
M03 · A. Appréhender le paradigme de la POO

Définir une classe : attributs et constructeur

Écrire une classe Python avec son constructeur __init__, ses attributs d'instance et ses attributs de classe, et savoir à quoi sert le destructeur.

1Situer

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.

2Comprendre

La classe est un moule, les objets en sortent
class Eleve nb_inscrits = 0 self.nom = ? self.age = ? self.heures = 0 __init__(nom, age) salma nom = "Salma" age = 19 heures = 0 karim nom = "Karim" age = 23 heures = 0 partagé par tous

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.

1 / 5

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

Le constructeur __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.

Les composantes d’une classe

ComposanteEn PythonExemple
attribut d’instanceself.x dans __init__self.nom
attribut de classevariable écrite dans la classenb_inscrits = 0
constructeur__init__initialise les attributs
destructeur__del__appelé quand l’objet disparaît
méthodedef dans la classeajouter_heure(self)

Types et visibilité

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.

Le destructeur

__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).

Exemple simple

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.

Exemple simple

Le compteur de tickets

À 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

3Manipuler

Exécutez le code et regardez le panneau « Mémoire » : la classe Eleve, ses deux objets et leurs attributs. Ajoutez un troisième élève, puis exécutez à nouveau.
Pas à pas dans le lab ↗Python se charge au premier clic (environ 12 Mo, une seule fois).
Console
Mémoire : objets créés

Exécutez le code : les objets et leurs attributs s'afficheront ici.

4Pratiquer

Exercice 1 · La classe Produit

É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.

Voir le corrigé
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)

Exercice 2 · Une valeur par défaut

Modifiez le constructeur pour que la ville d'un élève vaille « Meknès » si on ne la donne pas.

Voir un indice

Un paramètre peut avoir une valeur par défaut : def __init__(self, nom, ville=...).

Voir le corrigé
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

Exercice 3 · Compter les produits créés

Ajoutez à la classe Produit un attribut de classe nb_produits qui compte les produits créés.

Voir le corrigé
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

5Vérifier

1. À quoi sert la méthode __init__ ?
2. Que représente self dans une méthode ?
3. Quelle est la différence entre un attribut de classe et un attribut d'instance ?