La carte de cantine
À la cantine, tu as une carte avec de l’argent dessus. Tu peux la recharger. Tu peux payer ton repas.
Mais la machine refuse de te servir si ta carte est vide. Les règles sont dans la carte, pas dans ta tête.
Aujourd’hui, on écrit une classe dont les méthodes protègent leurs données.
Mots-clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Classe | Le moule qui fabrique des objets. Voir la leçon « Les objets ». | class CarteCantine: |
| Constructeur | La méthode __init__, lancée quand on crée l’objet. | def __init__(self, proprietaire): |
| Méthode | Une fonction rangée dans une classe. | carte.payer(3) |
| Encapsulation | Garder les données d’un objet à l’abri : on passe par ses méthodes. | carte.payer(3) et pas carte.solde = 0 |
| Solde | L’argent qui reste sur la carte. | carte.solde |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Un constructeur avec une valeur
Le constructeur peut recevoir des valeurs : le prénom du propriétaire, par exemple.
Les autres attributs prennent une valeur de départ : le solde commence à 0.
Chaque méthode peut regarder et changer les attributs avec self.
À toi : recharger et payer
class CarteCantine:
def __init__(self, proprietaire):
self.proprietaire = proprietaire
self.solde = 0
def recharger(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 = CarteCantine("Lina")
carte.recharger(10)
print(carte.solde)
print(carte.payer(3))
print(carte.solde)
print(carte.payer(20))
print(carte.solde)
# Que se passe-t-il si le repas coûte exactement le solde ?
Exemple travaillé : la vie d’une carte
| Ligne | Solde avant | Ce qui se passe | Solde après |
|---|---|---|---|
| carte.recharger(10) | 0 | on ajoute 10 | 10 |
| carte.payer(3) | 10 | 3 ne dépasse pas 10 : on enlève 3, on rend True | 7 |
| carte.payer(20) | 7 | 20 est plus grand que 7 : on ne change rien, on rend False | 7 |
| carte.payer(7) | 7 | 7 ne dépasse pas 7 : on enlève 7, on rend True | 0 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Contrôle rapide
À toi de jouer
Contrôle rapide
3 questionsTes réponses sont corrigées ici et ne sont pas conservées. Un compte garde tes résultats.
Passer par les méthodes
Rien n’empêche d’écrire carte.solde = 1000 depuis l’extérieur. Mais alors, plus de vérification !
On se donne une règle : les données d’un objet ne se touchent que par ses méthodes. C’est l’encapsulation.
Ainsi, les règles sont écrites à un seul endroit.
À toi : toucher au solde
class CarteCantine:
def __init__(self, proprietaire):
self.proprietaire = proprietaire
self.solde = 0
def payer(self, prix):
if prix > self.solde:
return False
self.solde = self.solde - prix
return True
carte = CarteCantine("Karim")
# Mauvaise idée : on touche au solde de l'extérieur.
carte.solde = 1000
print(carte.solde)
# Bonne idée : on passe par les méthodes, qui font les vérifications.
print(carte.payer(5000))
# Une règle entre nous : on ne change jamais carte.solde directement.
Des objets qui se parlent
Un objet peut recevoir un autre objet en paramètre. Il lui envoie alors un message en appelant une de ses méthodes.
Exemple : une carte donne de l’argent à une autre. Elle enlève de son solde, puis appelle autre.recharger(montant).