🧩python

La programmation orientee objet en Python : cours NSI Terminale

30 mars 2026 5 min de lecture

Introduction : Pourquoi la POO est essentielle en NSI

Si tu es en Terminale NSI, tu as déjà manipulé des variables, des fonctions et des structures de données. La Programmation Orientée Objet (POO) est l'étape suivante, et c'est un pilier du programme. Elle permet de modéliser des concepts du monde réel dans ton code, rendant tes programmes plus clairs, plus modulaires et plus faciles à maintenir. En Python, tout est objet (une chaîne, une liste, un dictionnaire...), comprendre la POO, c'est comprendre comment Python fonctionne vraiment. Dans cet article, on va démystifier ensemble les concepts de classe, objet, héritage et encapsulation avec des exemples concrets.

Les fondements : Classe vs Objet

Imagine que tu veux programmer un jeu avec des personnages. Chaque personnage a un nom, des points de vie et une arme. Tu pourrais créer trois variables pour chaque personnage, mais ça deviendrait vite le bazar. La POO propose une solution élégante : le plan et l'instance.

La Classe : Le plan à suivre

Une classe est un plan, un moule. Elle définit les caractéristiques (les attributs) et les comportements (les méthodes) que tous les objets de ce type auront en commun. Pour déclarer une classe en Python, on utilise le mot-clé class.

Pense à la classe Voiture. Le plan dit qu'une voiture a une marque, une couleur, une vitesse. Mais le plan en lui-même n'est pas une voiture que tu peux conduire.

L'Objet : L'instance concrète

Un objet est une instance d'une classe. C'est la matérialisation du plan. Tu peux créer autant d'objets que tu veux à partir d'une même classe, chacun avec ses propres valeurs d'attributs.

Voici un exemple simple pour illustrer :

class Personnage:
    """Une classe pour représenter un personnage de jeu."""

    def __init__(self, nom, points_de_vie):
        # Méthode constructeur
        self.nom = nom  # Attribut d'instance
        self.pv = points_de_vie

    def saluer(self):
        # Une méthode
        print(f"Bonjour, je m'appelle {self.nom} !")

# Création d'objets (instances)
hero = Personnage("Arthas", 100)
ennemi = Personnage("Gobelin", 30)

# Utilisation
hero.saluer()  # Affiche : Bonjour, je m'appelle Arthas !
print(f"{ennemi.nom} a {ennemi.pv} PV.")  # Affiche : Gobelin a 30 PV.

La méthode spéciale __init__ est le constructeur. Elle est appelée automatiquement à la création d'un nouvel objet (Personnage("Arthas", 100)). Le paramètre self représente l'instance en cours de création.

Les concepts avancés : Héritage et Encapsulation

Une fois que tu maîtrises la création de classes simples, deux concepts puissants entrent en jeu : l'héritage et l'encapsulation.

L'Héritage : Éviter la répétition

L'héritage permet de créer une nouvelle classe (classe fille) qui hérite des attributs et méthodes d'une classe existante (classe mère). C'est le principe "est un". Par exemple, un Mage est un Personnage particulier.

class Mage(Personnage):  # La classe Mage hérite de Personnage
    def __init__(self, nom, points_de_vie, mana):
        # On appelle le constructeur de la classe mère
        super().__init__(nom, points_de_vie)
        self.mana = mana  # Attribut spécifique au Mage

    def lancer_sort(self, cout_mana):
        if self.mana >= cout_mana:
            self.mana -= cout_mana
            print(f"{self.nom} lance un sort ! Il lui reste {self.mana} mana.")
        else:
            print("Pas assez de mana !")

gandalf = Mage("Gandalf", 80, 200)
gandalf.saluer()  # Méthode héritée : Bonjour, je m'appelle Gandalf !
gandalf.lancer_sort(50)  # Méthode spécifique

L'Encapsulation : Protéger les données

L'encapsulation est le principe qui consiste à cacher les détails internes d'une classe et à n'exposer qu'une interface contrôlée. En Python, on utilise des conventions :

  • Attribut public : self.nom (accessible de partout).
  • Attribut "protégé" (convention) : self._pv (un seul underscore). C'est un signal pour les autres développeurs : "Ne touche pas directement, utilise les méthodes".
  • Attribut "privé" (convention/name mangling) : self.__code_secret (deux underscores). Son nom est modifié par Python pour le rendre difficile d'accès depuis l'extérieur de la classe.

L'idée est d'utiliser des accesseurs (getters) et mutateurs (setters), souvent via la fonction @property, pour contrôler l'accès et la modification des attributs.

Méthodes spéciales et projets NSI

Python définit des méthodes spéciales (entourées de doubles underscores) qui permettent à tes objets d'interagir de manière naturelle avec les opérateurs du langage. C'est ce qui rend Python si expressif.

  • __str__(self) : Définit ce qui est affiché par print(mon_objet). Parfait pour le débogage.
  • __eq__(self, other) : Définit le comportement de l'opérateur d'égalité ==.
  • __add__(self, other) : Définit le comportement de l'addition +.
class Vecteur2D:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __str__(self):
        return f"Vecteur({self.x}, {self.y})"

    def __add__(self, other):
        """Addition de deux vecteurs."""
        return Vecteur2D(self.x + other.x, self.y + other.y)

v1 = Vecteur2D(1, 2)
v2 = Vecteur2D(3, 4)
v3 = v1 + v2  # Utilise __add__
print(v3)  # Utilise __str__ : Affiche "Vecteur(4, 6)"

Projet NSI : Tu peux appliquer la POO dans presque tous tes projets. Modélise un système de gestion de bibliothèque (classes Livre, Adherent, Emprunt), un jeu de plateau (classes Case, Joueur, Pion), ou une simulation (classes Animal, Environnement). Cela montrera ta maîtrise des concepts du programme.

Conclusion et pièges à éviter

La POO est un outil formidable, mais il faut l'utiliser à bon escient. Pour un petit script utilitaire, elle peut être superflue. Pour un projet de taille moyenne à grande, elle devient indispensable. Évite ces pièges courants :

  • Classes trop grandes ("God Class") : Une classe doit avoir une responsabilité unique et claire.
  • Héritage abusif : N'utilise l'héritage que si la relation "est un" est vraie. Préfère parfois la composition (un objet qui contient d'autres objets).
  • Négliger self : Oublier self dans la définition d'une méthode d'instance est une erreur classique.

Avec de la pratique, la POO deviendra une seconde nature. Elle est au cœur de nombreux frameworks et bibliothèques que tu utiliseras (comme PyGame ou Django), alors maîtrise-la bien !

📚 Pour aller plus loin

Questions fréquentes

Quelle est la différence fondamentale entre une classe et un objet ?

Une classe est un plan, un modèle conceptuel (comme le plan d'une maison). Un objet est une instance concrète créée à partir de ce plan (la maison construite). Tu définis une classe une fois, mais tu peux créer de nombreux objets (instances) différents à partir d'elle.

À quoi sert vraiment le paramètre 'self' dans les méthodes ?

'self' est une référence à l'instance courante de la classe. Quand tu appelles une méthode comme `hero.saluer()`, Python transforme cela en `Personnage.saluer(hero)`. 'self' permet à la méthode d'accéder et de modifier les attributs spécifiques de cet objet (`self.nom`, `self.pv`). C'est le lien entre la méthode (définie une fois pour la classe) et les données uniques de chaque objet.

Quand dois-je utiliser l'héritage plutôt que de créer une classe séparée ?

Utilise l'héritage uniquement quand la relation entre deux concepts est du type "EST UN". Par exemple, un `Mage` EST UN `Personnage` spécialisé. Si la relation est "A UN" ou "UTILISE", privilégie la composition. Par exemple, une `Voiture` A UN `Moteur`. Il vaut mieux alors créer une classe `Moteur` et avoir un attribut `self.moteur` dans la classe `Voiture`. L'héritage abusif crée des structures rigides et difficiles à maintenir.

Bravo ! Tu as lu cet article
Inscris-toi pour sauvegarder ta progression et gagner des XP
Creer mon compte
POO Python NSIclasses objets Pythonprogrammation objet terminale
Pixel