Une classe est un moule. Chaque objet est une pièce.
On écrit une fois le comportement (la classe), puis on fabrique autant d'objets qu'on veut. Chacun a ses propres valeurs, mais hérite des mêmes méthodes.
class Chien:
def __init__(self, nom, age):
self.nom = nom
self.age = age
self.faim = 5
self.energie = 5
def aboyer(self):
self.energie -= 1
cri = "Wouaf !" if self.age < 5 else "Wouaf wouaf !"
print(f"{self.nom} : {cri}")
def manger(self):
self.faim = max(0, self.faim - 3)aucune instance encore. Avancez d'un pas.
script
explication
— (appuyez sur suivant pour démarrer)
sortie
— (console vide)
Quand vous écrivez fido.aboyer(), Python traduit en interne en Chien.aboyer(fido). L'objet sur lequel on appelle la méthode est passé en premier argument — c'est ce qu'on nomme self.
ce qu'on écrit
fido.aboyer()
rex.aboyer()
ce que Python fait
Chien.aboyer(fido)
Chien.aboyer(rex)
Le code est écrit une seule fois (dans la classe), mais comme self change à chaque appel, le comportement s'adapte à chaque objet. C'est le cœur de l'orienté objet.
Ne lancez pas le code dans votre tête « au hasard » : prédisez d'abord. L'état final reste masqué tant que le palier n'est pas réussi — en cas d'erreur, vous saurez seulement s'il faut viser plus haut ou plus bas. À chaque appel, souvenez-vous que self désigne l'objet écrit à gauche du point.
fido vient d'être créé. On exécute fido.manger(). Prédisez sa nouvelle valeur de faim, puis vérifiez.
fido.faim = ?programme exécuté
votre prédiction
instances — la colonne « final » se dévoile une fois le palier réussi
fido
- Chaque instance porte ses propres attributs ; modifier l'un n'affecte pas l'autre.
- Une méthode reçoit l'instance appelante en
self: x.f() ⇔ Classe.f(x). - Pour prédire un état final, filtrez la séquence par cible avant de compter les effets.
- copain = fido ne copie rien : les deux noms désignent le même objet. Un appel sur l'un se voit sur l'autre.