Les classes en Python

Les classes en Python

Dans le programme de Terminale NSI, la notion de classes apparaît. En 1ère, on ne doit pas en parler car la Première est une classe d’initiation avancée. Comment se présente une classe ? Et en quoi peut-elle aider ? Voici quelques éléments de réponse.

C’est quoi une classe ?

On va dire, pour simplifier, que c’est un objet qui regroupe plusieurs fonctions. Par exemple, la classe marteau pourra avoir comme fonction enfoncer, fonction qui aura comme argument par exemple un clou.

Les fonctions des classes sont appelées des méthodes. Quant aux arguments des méthodes, on les appelle des attributs.

Et ça donne quoi en Python ?

L’implémentation d’une classe peut se faire de diverses façons, mais je vais en montrer une seule, que je trouve plus pratique, plus simple. Pour ce paragraphe, je ne vais plus prendre l’exemple du marteau, mais un exemple plus parlant. Je vais créé une classe mot avec une méthode anagramme qui aura pour mission de recracher une anagramme du mot.

from random import shuffle

class Mot:
    def __init__(self,mot):
        self.mot = mot

    def anagramme(self):
        a = list(self.mot)
        shuffle(a)
        return "".join( a )

m = Mot("palindrome")
print( m.anagramme() )

On commence alors par définir une variable “m” comme étant un Mot (un objet défini par notre classe) construit à partir d’une chaîne de caractères (ici, “palindrome”). Alors, “m.anagramme()” va désigner l’action faite sur le mot “m” en utilisant la méthode anagramme; le résultat sera une chaîne de caractères correspondant à une anagramme de l’objet “m”.

On peut imaginer alors plusieurs méthodes pour un même objet. Les classes font d’ailleurs partie de ce que l’on appel la Programmation Orientée Objet (POO).

Un autre exemple (pour la route)

class Rectangle:
    def __init__(self,a,b):
        self.longueur, self.largeur = a , b

    def perimetre(self):
        return 2 * (self.longueur + self.largeur)

    def aire(self):
        return self.longueur * self.largeur

    def is_square(self):
        return self.longueur == self.largeur

fig = Rectangle(3,8)

print( "Le périmétre est :" , fig.perimetre() )
print( "L'aire est :" , fig.aire() )
if fig.is_square():
    print( "C'est un carré" )
else:
    print("Ce n'est pas un carré")

Ici, on définit l’objet “Rectangle” avec trois méthodes : perimetre, aire et is_square qui respectivement donnent le périmètre et l’aire du rectangle (en l’occurrence) et qui dit ci c’est un carré ou pas.

Pour aller plus loin…

Là où ça commence à être intéressant, c’est quand on souhaite implémenter des objets plus abstraits comme les arbres ou les graphes.

J’ai créé une classe qui gère la construction de graphes non pondérés, leurs parcours (en largeur et en profondeur), et d’autres opérations (comme l’affichage de tous les chemins d’un sommet à un autre), ainsi qu’une autre classe permettant d’obtenir le plus court chemin pour un graphe pondéré à l’aide de l’algorithme de Dijkstra.

Les abonné.e.s de mathweb.fr trouveront dans un fichier .py:

  • une classe Graphe avec les méthodes addArete (pour ajouter une arête entre deux sommets afin d’implémenter le graphe, de le définir), cycles (pour afficher tous les cycles du graphe), chemins (pour afficher tous les chemins d’un sommet à un autre), parcoursProfondeur et parcoursLargeur (qui parcourent donc le graphe en profondeur et en largeur);
  • une classe GraphePondM (destinée aux graphes pondérés définis par une matrice de valuation) avec les méthodes add (qui ajoute une ligne à la matrice de valuation), dijkstra (qui retourne le plus court chemin à partir d’un sommet vers tous les autres sommets);
  • une classe GraphePond (destinée aux graphes pondérés définis par liste d’adjacence valuée – par exemple, add(‘A’,’B’,4) signifie qu’il y a un arc orienté de A vers B avec un poids de 4). Cette classe admet les mêmes méthodes que GraphePondM.

Ce fichier est téléchargeable sur cette page.

Stéphane Pasquet
Stéphane Pasquet

Laissez votre message