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. Avance d'un pas.
script
explication
— (appuie sur suivant pour démarrer)
sortie
— (console vide)
Quand tu écris 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 lance pas le code dans ta tête « au hasard » : prédis d'abord, puis révèle. À chaque appel, souviens-toi que self désigne l'instance écrite à gauche du point.
fido vient de naître (faim = 5). On exécute fido.manger(). Prédis sa nouvelle valeur de faim, puis vérifie.
fido.faim = ?séquence exécutée
ta prédiction
- 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, filtre la séquence par cible avant de compter les effets.