🎯 Objectifs de la lecon
- •Définir une classe et instancier un objet
- •Utiliser des attributs et des méthodes
- •Appliquer l'encapsulation avec des propriétés
- •Implémenter l'héritage simple entre classes
La programmation orientée objet (POO) est un paradigme qui organise le code autour d'objets. Un objet regroupe des données (attributs) et des actions (méthodes). En Python, tout est objet : les entiers, les listes, les fonctions. Ce cours t'explique comment créer tes propres classes.
Classes et objets
Une classe est un modèle qui définit la structure et le comportement d'objets. Un objet est une instance d'une classe. Pour créer une classe, utilise le mot-clé class suivi du nom de la classe (par convention, en CamelCase).
Exemple : class Personnage: crée une classe nommée Personnage. Pour créer un objet, écris p = Personnage(). L'objet p est une instance de la classe Personnage.
✔️ A retenir
Une classe est un moule. Un objet est une réalisation concrète de ce moule.
Attributs et méthodes
Les attributs sont des variables qui appartiennent à un objet. Ils stockent l'état de l'objet. Les méthodes sont des fonctions définies dans la classe et qui agissent sur l'objet.
Le constructeur __init__ est une méthode spéciale appelée automatiquement lors de la création d'un objet. Il permet d'initialiser les attributs. Le premier paramètre de toute méthode est self, qui représente l'objet lui-même.
« class Personnage: def __init__(self, nom): self.nom = nom ; self.pv = 100 »
Point fort : Le constructeur initialise les attributs nom et pv pour chaque nouvel objet.
Pour ajouter une méthode, définis une fonction dans la classe avec self en premier paramètre. Exemple : def parler(self): print(f"Je suis {self.nom}").
⚠️ Attention
N'oublie pas le mot-clé self dans la définition de la méthode. Sans lui, Python ne sait pas à quel objet la méthode s'applique.
Encapsulation et propriétés
L'encapsulation consiste à protéger les attributs d'un objet en les rendant privés. En Python, on indique un attribut privé en le préfixant par deux underscores : __pv. L'accès direct depuis l'extérieur est alors interdit.
Pour lire ou modifier un attribut privé, on utilise des propriétés. Une propriété se crée avec le décorateur @property pour la lecture, et @nom.setter pour l'écriture. Cela permet de contrôler les valeurs.
« @property def pv(self): return self.__pv ; @pv.setter def pv(self, valeur): if valeur >= 0: self.__pv = valeur »
Point fort : Le setter empêche de mettre un nombre négatif de points de vie.
✔️ A retenir
L'encapsulation protège les données. Les propriétés offrent un accès contrôlé.
Héritage simple
L'héritage permet de créer une nouvelle classe à partir d'une classe existante. La nouvelle classe (classe fille) hérite des attributs et méthodes de la classe mère. On utilise la syntaxe class Fille(Mere):.
La classe fille peut ajouter de nouveaux attributs ou méthodes, ou redéfinir (surcharger) une méthode existante. Pour appeler une méthode de la classe mère, utilise super().nom_methode().
« class Guerrier(Personnage): def __init__(self, nom, force): super().__init__(nom) ; self.force = force »
Point fort : super().__init__(nom) appelle le constructeur de Personnage pour initialiser nom et pv.
⚠️ Attention
Si tu redéfinis __init__ dans la classe fille sans appeler super().__init__, les attributs de la classe mère ne seront pas initialisés.
Exemple complet
Voici un exemple qui rassemble les notions : classe Personnage avec attributs privés et propriétés, et classe Guerrier qui hérite de Personnage.
class Personnage: def __init__(self, nom): self.__nom = nom ; self.__pv = 100 ; @property def nom(self): return self.__nom ; @property def pv(self): return self.__pv ; @pv.setter def pv(self, valeur): if valeur >= 0: self.__pv = valeur ; def parler(self): print(f"Je suis {self.__nom}")
class Guerrier(Personnage): def __init__(self, nom, force): super().__init__(nom) ; self.__force = force ; @property def force(self): return self.__force ; def attaquer(self, cible): cible.pv -= self.__force
Utilisation : g = Guerrier("Arthur", 20) ; g.parler() ; g.attaquer(autre_personnage). L'attribut pv de la cible est modifié via le setter.
Erreurs fréquentes
- Oublier self dans la définition d'une méthode : Python lèvera une erreur car il attend l'objet en premier argument.
- Confondre attribut de classe et attribut d'instance : un attribut défini en dehors de __init__ est partagé par toutes les instances.
- Ne pas appeler super().__init__ dans la classe fille : les attributs de la classe mère ne sont pas initialisés.
- Utiliser un attribut privé depuis l'extérieur : Python ne l'interdit pas totalement mais le nom est modifié (name mangling), ce qui est déconseillé.
