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
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Classe | le plan qui décrit une sorte de chose | class Carte: |
| Objet | une chose fabriquée à partir d’une classe | carte = Carte("Awa", 500) |
| Attribut | une donnée rangée dans un objet | carte.solde |
| Méthode | une fonction qui appartient à une classe | carte.payer(330) |
| Constructeur | la méthode qui prépare un objet neuf, nommée __init__ | |
| self | l’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
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
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
mkdir -p essaisAffiché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
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.pyAffiché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
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
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
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.