Dans le programme de Terminale NSI, la notion de classes Python apparaît. En 1ère, on ne doit pas en parler car la Première est une classe d’initiation. 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 les classes en Python ?
L’implémentation d’une classe peut se faire de diverses façons. Je vais en montrer une seule, que je trouve plus pratique et 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. m est un objet défini par notre classe. Cet objet est 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, qui donne le périmètre du rectangle
- aire, qui donne son aire
- is_square, qui dit si c’est un carré.
Pour aller plus loin…
Là où ça commence à être intéressant, c’est quand on souhaite implémenter des objets plus abstraits. Par exemple, des arbres ou des graphes.
J’ai créé une classe qui gère :
- la construction de graphes non pondérés,
- leurs parcours (en largeur et en profondeur),
- 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.
Vous trouverez dans un fichier .py:
- Graphe, une classe avec plusieurs méthodes. addArete permet d’ajouter une arête entre deux sommets afin d’implémenter le graphe, de le définir). cycles permet d’afficher tous les cycles du graphe). chemins permet d’afficher tous les chemins d’un sommet à un autre. parcoursProfondeur et parcoursLargeur qui parcourent donc le graphe en profondeur et en largeur;
- GraphePondM, une classe destinée aux graphes pondérés définis par une matrice de valuation, avec plusieurs méthodes. add : ajoute une ligne à la matrice de valuation. dijkstra : retourne le plus court chemin à partir d’un sommet vers tous les autres sommets;
- GraphePond, une classe 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 ci-dessous: