Aller au contenu

Introduction à la programmation orienté objet⚓︎

image

abrégée par POO en français, OOP en anglais (ne pas confondre)

image

I. Introduction⚓︎

Le paradigme objet

La POO est un paradigme de programmation, au même titre que la programmation impérative (que nous pratiquons déjà) ou la programmation fonctionnelle (qui sera évoquée cette année en Terminale), ou encore d'autres paradigmes (la liste est longue).

La programmation orientée objet repose, comme son nom l’indique, sur le concept d’objet.

Un objet dans la vie courante, vous connaissez, mais en informatique, qu’est ce que c’est ?
Une variable ?
Une fonction ?
Ni l’un ni l’autre, c’est un nouveau concept.

II. Vocabulaire de la programmation objet⚓︎

Les objets

La programmation objet consiste à regrouper données et traitements dans une même structure appelée objet. Elle possède l'avantage de localiser en un même endroit toute l'implémentation d'une structure de données abstraite.

Prenons une chat comme exemple

Un chat peut être considérer comme un objet.

  • On peut lui associer des informations comme son pelage, saon âge et son surnom : il s'agit des attributs de notre objet.

  • On peut également définir des mécanismes concernant cet objet comme courrir, attraper des souris : il s'agit des méthodes qui vont s'appliquer sur notre objet.

Les objets

Concrètement, un objet est une structure de données abstraite regroupant :

  • des données associées à cet l'objet que l'on appelle des attributs .
  • des fonctions (ou procédures) s'appliquant sur l'objet que l'on appelle des méthodes.

Les classe

Un des nombreux avantages de la programmation orientée objet (POO), est qu’il existe des milliers d’ « objets » .
Il convient maintenant d'être plus précis.On parle plutôt de classes.

On désignera par classe la structure de données définissant une catégorie générique d'objets.

Exemple de classe

Reprenons l'exemple du chat

  • Dans le monde animal, Chat est une classe (nommée en réalité félidé ).
  • Chaque élement de la classe chat va se distinguer par des caractéristiques : un âge, une couleur de pelage, un surnom... (ses attributs) et des fonctionnalités, comme la méthode attrape_souris.

Par exemple, l'objet Larry est une instance de la classe chat .

image

D'après Wikipedia,

Python
Larry.pelage = "blanc et tabby"
Larry.surnom = "Chief Mouser to the Cabinet Office"

Toujours d'après Wikipedia, la méthode larry.attrape_souris est plutôt efficace.

Les instances

On va donc pouvoir créer facilement des objets Chat grâce à cette classe (moule).

Il suffit pour les construire d'utiliser le nom de la classe (qui est aussi le nom du constructeur d'objets de cette classe). Chaque objet ainsi créé est une instance de la classe. Par exemple :

  • Larry = Chat()
  • Perle = Chat()

Remarque

  • Les méthodes définies dans une classe ne sont applicables que sur les objets instances de la classe.
  • Inversement, un objet instance d’une classe ne peut se voir appliquer que les méthodes de cette classe.

Accès aux attributs et aux méthodes

Pour accéder aux attributs et aux méthodes d'une classe on utilise la notation pointée.

Dans notre exemple :

  • Larry.pelage donne la couleur du pelage, c'est à dire "blanc et tabby"
  • Larry.attrape_souris() va demander à Larry d'attraper une souris.

La Programmation Orientée Objet sera (surtout à notre niveau) mélangée avec de la programmation impérative, de la programmation fonctionnelle... d'ailleurs vous avez déjà manipulé des objets sans le savoir :

III. Des objets déjà autour de nous - Classes et objets en Python⚓︎

En Python, tout est objet !

Vous ne le saviez sans doute pas, mais les objets vous connaissez déjà (et oui !)

Les listes en Python

Les listes sont un type abstrait list dans python; et vous utilisez la notation pointée pour ajouter un élément.

Recopier une par une les lignes suivantes, et les exécuter une par une.

>>> ma_liste = [2, 3, 5]
>>> type(ma_liste)
>>> ma_liste.append(8)
>>> ma_liste

Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Les types en Python

L'affichage montre que tous les types en Python sont des classes. Les entiers sont des objets de la classe int, les flottants sont des objets de la classe float, etc. Pour créer un entier ou une liste il suffit de les construire en utilisant le nom de leurs classes respectives

Recopier une par une les lignes suivantes, et les exécuter une par une.

>>> type(int)
>>> type(float)
>>> entier = int()
>>> type(entier)
>>> ma_liste = list()
>>> type(ma_liste) 

Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Interface d'une classe

En définissant une classe on définit un type abstrait de données. Comme tout type abstrait, une classe possède donc une interface qui décrit l'ensemble des méthodes auxquelles on a accès pour manipuler les objets de cette classe.

On peut utiliser la fonction dir pour lister tous les attributs et méthodes d'un objet.

Taper dir(list) dans la console python pour visualiser les différentes méthodes et attributs de list.

Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Les méthodes du type prédéfini list

On retrouve ici les méthodes applicables sur les objets du type prédéfini list.

Son interface est disponible dans la documentation officielle

Vous noterez que l'interface ne précise pas la façon dont les méthodes sont implémentées mais juste la façon de les utiliser, ce qui suffit largement généralement.

On constate aussi qu'il y a de nombreuses méthodes dont le nom est encadré d'un double underscore __.
Ce sont des méthodes privées, a priori non destinées à l'utilisateur. Nous reviendrons sur quelques-unes d'entre elles un peu plus tard.

Les méthodes publiques, utilisables pour chaque objet de type list, sont donc append, clear, ...

Python
>>> m = [4,5,2]
>>> type(m)
list

m est une liste, ou plus précisément un objet de type list. Et en tant qu'objet de type list, il est possible de lui appliquer certaines fonctions prédéfinies (qu'on appelera méthodes) :

Python
>>> m.reverse()

La syntaxe utilisée (le . après le nom de l'objet) est spécifique à la POO. Chaque fois que vous voyez cela, c'est que vous êtes en train de manipuler des objets.
Mais qu'a donc fait cette méthode reverse() ?

Python
>>> m
[2, 5, 4]

Nous ne sommes pas surpris par ce résultat car la personne qui a programmé la méthode reverse() lui a donné un nom explicite.
Comment a-t-elle programmé cette inversion des valeurs de la liste ? Nous n'en savons rien et cela ne nous intéresse pas. Nous sommes juste utilisateurs de cette méthode. L'objet de type list nous a été livré avec sa méthode reverse() (et bien d'autres choses) et nous n'avons pas à démonter la boîte pour en observer les engrenages : on parle de principe d'encapsulation.

Comment savoir ce que font les méthodes ? Si elles ont été correctement codées (et elles l'ont été), elles possèdent une docstring, accessible par :

Python
>>> help(m.append)
Help on built-in function append:

append(object, /) method of builtins.list instance
    Append object to the end of the list.

>>> help(m.reverse)__doc__
Help on built-in function reverse:

reverse() method of builtins.list instance
    Reverse *IN PLACE*.

IV. Bilan⚓︎

Le paradigme objet

Le paradigme objet est une autre façon de voir la programmation qui consiste à utiliser une structure de données appelée objet qui réunit des données et des fonctionnalités. Les données sont appelées attributs et les fonctionnalités sont appelées méthodes.

Une classe

Une classe permet de définir un ensemble d’objets qui ont des caractéristiques communes. C’est un moule permettant de créer une infinité d’objets différents dans leurs valeurs mais similaires dans leur structure.

Le mot clé class et les instances de classes

En Python, on utilise le mot clé class pour définir une classe qui devient alors un nouveau type abstrait de données.

On peut alors créer de nouveaux objets en appelant le constructeur qui porte le nom de la classe. Les objets ainsi créés s'appellent des instances de la classe.

La méthode __init__

En Python, la méthode __init__ est le constructeur de la classe. Elle est utilisée à la création des objets de la classe et initialise les valeurs des attributs de l’objet.

La notation pointée

Les attributs et méthodes d'une instance de classe sont accessibles en utilisant la notation pointée :

  • objet.attribut
  • objet.methode(arguments)

Des objets différents

  • Deux instances d'une classe, objet_1 et objet_2, même avec des attributs identiques, sont des objets différents.
  • objet_1 == objet_2 est évalué à False