fiche POO

Comprendre la programmation objet
Qu'est-ce qu'une classe ?

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.

Attributs — ce que l'objet sait
self.nom
self.poids
self.date_arrivee
→ des données propres à chaque objet
Méthodes — ce que l'objet fait
__init__()
__str__()
chasser()
→ des fonctions qui opèrent sur l'objet

Analogie : la classe Renard est la fiche descriptive, chaque objet renard1 = Renard(...) est un renard concret avec ses propres valeurs.

À quoi sert 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).

class Renard:
  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.

Les méthodes spéciales à maîtriser
constructeur
__init__ — créer un objet

Appelé 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.

def __init__(self, a, b):
  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.

affichage
__str__ — représentation textuelle

Appelé automatiquement par print(objet) et str(objet). Doit obligatoirement return une chaîne de caractères — jamais de print() à l'intérieur.

def __str__(self):
  # 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.

méthode personnalisée
Écrire une méthode qui accède aux attributs et appelle d'autres méthodes
def smoothie_possible(self, nom_smoothie):
  # ↑ 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.

Checklist lecture d'une question sur les classes
Avant de coder

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…)

En codant

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).

Avant de valider

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 ?

Erreurs les plus fréquentes en objet

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().