Plus facile à lire avec un fond crème, une teinte, plus de contraste ou un texte plus grand ? Choisissez vos couleurs et votre texte, une fois pour toutes les pages.

Leçon gratuite

Classes et objets en Python

Après cette leçon: Je peux modéliser une chose comme une classe, avec ses attributs et ses méthodes.

Leçon de 55 min5 commandesLab Linux du quotidien : la trentaine de commandes que les ingénieurs tapent de tête

Qu’est-ce qu’une classe en programmation objet ?

Une classe est un plan qui décrit une chose du programme : ses données et ce qu’elle sait faire. Un objet est une chose fabriquée avec ce plan. Savoir écrire une classe vous permet de modéliser une carte, un colis ou un compte sans éparpiller ses variables.

Le restaurant universitaire gère des cartes prépayées. Chaque carte a un titulaire et un solde, et deux gestes : recharger et payer.

À la fin de cette leçon

Remarque

Je peux modéliser une chose comme une classe, avec ses attributs et ses méthodes.

Mots-clés

MotCe que ça veut direExemple
Classele plan qui décrit une sorte de choseclass Carte:
Objetune chose fabriquée à partir d’une classecarte = Carte("Awa", 500)
Attributune donnée rangée dans un objetcarte.solde
Méthodeune fonction qui appartient à une classecarte.payer(330)
Constructeurla méthode qui prépare un objet neuf, nommée __init__
selfl’objet sur lequel la méthode travaille

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Sans classe, les données d’une carte sont éparpillées

Vous pouvez ranger une carte dans un dictionnaire. Les gestes sont alors des fonctions écrites à côté, qui reçoivent le dictionnaire.

Cela marche tant qu’il y a une seule sorte de carte. Dès que le programme grandit, rien ne dit quelles fonctions vont avec quelles données.

Une carte avec un dictionnaire

Code: python
carte = {"titulaire": "Awa", "solde": 500}

def payer(carte, prix):
    if prix > carte["solde"]:
        return False
    carte["solde"] = carte["solde"] - prix
    return True

print(payer(carte, 330), carte["solde"])

Une classe réunit les données et les gestes

Une classe place les données et les fonctions au même endroit. Les données sont les attributs. Les fonctions sont les méthodes.

La méthode __init__ prépare un objet neuf. Chaque méthode reçoit en premier paramètre self : c’est l’objet sur lequel elle travaille.

La classe Carte

Code: python
class Carte:
    def __init__(self, titulaire, solde):
        self.titulaire = titulaire
        self.solde = solde

    def crediter(self, montant):
        self.solde = self.solde + montant

    def payer(self, prix):
        if prix > self.solde:
            return False
        self.solde = self.solde - prix
        return True


carte = Carte("Awa", 500)
carte.crediter(250)
print(carte.payer(330), carte.solde)

Créer un dossier pour les essais

Commande
mkdir -p essais

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Écrire la classe dans un fichier

Commande
printf 'class Carte:\n    def __init__(self, titulaire, solde):\n        self.titulaire = titulaire\n        self.solde = solde\n\n    def crediter(self, montant):\n        self.solde = self.solde + montant\n\n    def payer(self, prix):\n        if prix > self.solde:\n            return False\n        self.solde = self.solde - prix\n        return True\n' > essais/carte.py

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Recharger puis payer deux fois

Commande
PYTHONPATH=essais python3 -c "from carte import Carte; c = Carte('Awa', 500); c.crediter(250); print(c.payer(330), c.solde); print(c.payer(500), c.solde)"

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Chaque objet garde ses propres attributs

On fabrique autant d’objets que l’on veut avec une seule classe. Chacun a ses attributs à lui.

Payer avec la carte d’Awa ne change pas le solde de la carte de Léo. Les deux objets partagent les méthodes, jamais les valeurs.

Deux cartes, deux soldes

Commande
PYTHONPATH=essais python3 -c "from carte import Carte; a = Carte('Awa', 100); b = Carte('Leo', 900); a.payer(40); print(a.solde, b.solde)"

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Lire la classe d’un objet

Commande
PYTHONPATH=essais python3 -c "from carte import Carte; c = Carte('Awa', 100); print(type(c).__name__, c.titulaire)"

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Erreur fréquente

Attention

Beaucoup croient que la classe et l’objet sont la même chose. La classe est le plan, il n’y en a qu’un. Les objets sont les cartes fabriquées. Changer l’attribut d’un objet ne change ni la classe ni les autres objets.

Écrire la classe CarteResto

Dans le devoir, vous écrivez la classe CarteResto. Son constructeur reçoit un titulaire et un solde en centimes et les range dans l’objet.

crediter(montant) ajoute au solde. payer(prix) rend True et retire le prix si le solde suffit. Sinon elle rend False et ne touche pas au solde.

À propos de ce labo et de sa source: Lab Linux du quotidien : la trentaine de commandes que les ingénieurs tapent de tête

Vous enseignez à une classe ? Proposez ce module à vos étudiants avec un guide de l'enseignant, des devoirs corrigés et un laboratoire pour chaque étudiant.