fiche POO
Une classe est un moule qui décrit comment fabriquer des objets. Elle regroupe des données (attributs) et des comportements (méthodes) qui appartiennent à un même concept.
Analogie : la classe Renard est la fiche descriptive, chaque objet renard1 = Renard(...) est un renard concret avec ses propres valeurs.
self ?self désigne l'objet en cours d'utilisation. C'est une référence automatique vers l'instance qui appelle la méthode. Python le passe en secret : quand on écrit renard1.chasser(200, 3), Python exécute en réalité Renard.chasser(renard1, 200, 3).
def __init__(self, identifiant, nom, poids, date_arrivee):
# self ↑ toujours 1er paramètre, jamais oublier
self.identifiant = identifiant # crée l'attribut sur CET objet
self.nom = nom # self.X = X pour chaque param
self.poids = poids
self.date_arrivee = date_arrivee
renard1 = Renard(101, 'Zorro', 4.2, '2023-01-15')
renard2 = Renard(102, 'Luna', 3.8, '2024-03-01')
# renard1.nom == 'Zorro' ≠ renard2.nom == 'Luna'
# chaque objet a ses propres attributs
Oublier self comme premier paramètre d'une méthode provoque une TypeError au moment de l'appel. C'est une erreur systématique à vérifier en relecture.
Écrire nom = valeur au lieu de self.nom = valeur dans __init__ crée une variable locale qui disparaît immédiatement — l'attribut n'existe pas.
__init__ — créer un objetAppelé automatiquement lors de MonObjet(...). Son rôle : initialiser tous les attributs de l'objet. Un attribut non défini ici mais utilisé ailleurs lèvera une AttributeError.
self.a = a # attribut créé
self.b = b # attribut créé
self.c = 0 # attribut avec valeur par défaut
self.liste = [] # attribut liste vide
Repérer tous les self.X utilisés dans les autres méthodes du sujet → ils doivent tous être initialisés ici.
__str__ — représentation textuelleAppelé automatiquement par print(objet) et str(objet). Doit obligatoirement return une chaîne de caractères — jamais de print() à l'intérieur.
# méthode 1 : concaténation classique
ch = 'Renard ID '
ch += str(self.identifiant) # ← convertir int en str !
ch += ' - ' + self.nom
return ch
# méthode 2 : f-string (plus lisible)
return f'Renard ID {self.identifiant} - {self.nom}'
Retourner un entier ou None depuis __str__ lève une TypeError. Tout doit être converti en str avant la concaténation.
# ↑ self toujours 1er, puis les vrais paramètres
for fruit in self.db_smoothies[nom_smoothie]:
# ↑ on accède à un attribut de l'objet via self.
if fruit not in self.liste_fruits_disponibles:
return False
return True
def liste_smoothies_possibles(self):
possibles = []
for smoothie in self.db_smoothies:
if self.smoothie_possible(smoothie):
# ↑ appel d'une autre méthode : self.nom_methode(args)
possibles.append(smoothie)
return possibles
Règle d'or : tout accès à un attribut de l'objet ou à une autre méthode de la classe passe par self. — sans exception.
1. Identifier la classe concernée et lire ses attributs dans __init__.
2. Repérer les méthodes déjà fournies que je peux appeler via self.
3. Relire la docstring : que doit retourner la méthode ? (bool, list, int, str, None…)
4. Premier paramètre = self, puis les autres.
5. Chaque accès à une donnée de l'objet : self.attribut.
6. Chaque appel à une méthode de la classe : self.methode(args).
7. La méthode retourne bien le bon type ? (ne pas oublier le return)
8. Pour __str__ : tout est bien converti en str ?
9. Pour __init__ : tous les attributs attendus sont bien créés avec self.X = X ?
Oublier self en 1er paramètre
Erreur : TypeError: smoothie_possible() takes 1 positional argument but 2 were given
Écrire nom = x au lieu de self.nom = x
L'attribut n'existe pas → AttributeError ailleurs dans le code.
Appeler une méthode sans self.
Écrire smoothie_possible(nom) au lieu de self.smoothie_possible(nom) → NameError.
Retourner une valeur non-string dans __str__
Retourner self.identifiant (un int) sans str() → TypeError lors du print().