Programmation orientée objet (POO)


Vocabulaire

La programmation objet permet de structurer un programme complexe en un ensemble d'objets interagissant entre eux et avec le monde extérieur.

Par exemple, l'objet "voiture" ou la classe "voiture" (le concept général de voiture) est défini par :

  1. des propriétés communes à toutes les voitures (4 roues, 1 volant...), on parle d'attribut de classe ;
  2. des propriétés particulières à chaque voiture (marque, couleur...), on parle d'attribut d'instance ;
  1. des fonctions communes à toutes les voitures (contrôle moteur...), on parle de méthode de classe ;
  2. des fonctions particulières à chaque voiture (freinage assisté, parking assisté...), on parle de méthode d'instance.

Une fonction python est d'abord définie (mot clé def) puis appelée avec ses paramètres.
De façon analogue, un objet est d'abord défini (mot clé class) puis un objet particulier, appelé instance, est créé avec ses propres caractéristiques.

Classe, attributs et méthodes

Création d'une classe, attribut d'instance

Bonne pratique : un nom de classe commence par une majuscule.


Noter la présence du mot clé self :
- dans la fonction __init__(self, couleur) ;
- dans le nom d'attribut self.couleur.
Le mot clé self fait référence à l'instance elle-même et non à la classe en général : l'attribut couleur est une caractéristique de la classe mais sa valeur est propre à l'instance (contrairement à l'attribut de classe, cf. ci-dessous).
self.couleur est un attribut d'instance.
La méthode __init__(self) est le constructeur de la classe : elle permet d'allouer la mémoire, d'initialiser les attributs de l'instance et d'appeler d'autres méthodes (le paramètre self est obligatoire).

Il est possible de modifier un attribut d'instance :


Exercice - Il est possible de créer plusieurs objets : ajouter ci-dessus le code nécessaire pour créer une voiture verte.

Exercice - Dans la cellule ci-dessous, modifier le code de façon à définir l'attribut d'instance appelé marque pour la classe voiture. Tester (3 lignes doivent être modifiées).


Attribut de classe

Il peut être utile de disposer d'une variable accessible dans toutes les instances et commune à toutes les instances (contrairement à un attribut d'instance, comme la couleur, défini pour chaque instance).


L'attribut de classe Voiture.nombre_voitures est accessible depuis la classe Voiture ou depuis n'importe qu'elle instance (v1.nombre_voiture) et sa valeur est commune à toutes les instances.

Méthode d'instance


Noter la présence obligatoire du mot clé self :
- dans les paramètres lors de la définition de la méthode d'instance acceleration(self, v, t) ;
- devant le nom de la fonction lors d'un appel à l'intérieur de la définition de la classe : self.acceleration(v, t).
Le nom de l'instance est utilisé lors d'un appel de la méthode dans le programme : v1.acceleration(50, 10).

Méthode de classe

Il est possible de définir des méthodes, liées à la classe, communes à toutes les instances.
Cf. Python Tutorial si nécessaire.

Méthode statique

Il est possible de définir des méthodes, internes à la classe mais indépendantes de celle-ci (fonctions de calcul par exemple), communes à toutes les instances.
Cf. Python Tutorial si nécessaire.

Héritage simple

Une classe dite "fille" peut être définie à partir d'une autre classe dite "parent" :
class Voiture_sport(Voiture)
La classe fille hérite alors des attributs et des méthodes de la classe parent mais il est possible d'ajouter des attributs et des méthodes spécifiques à la classe fille ou de modifier les attributs et les méthodes de la classe parent, on parle de surcharge de la classe parent.


La classe fille peut également modifier une méthode de la classe parent en la réutilisant et en la complétant : cf. méthode caracteristiques() ci-dessous. On parle alors de polymorphisme : une méthode possèdant le même nom dans la classe fille et dans la classe parent n'effectue pas exactement le même travail dans les deux classes.


Le résultat produit par la méthode voiture est le même dans les deux derniers codes ci-dessus mais :
- dans le 1er cas (surcharge), la méthode est totalement récrite (elle écrase la méthode de la classe parent)
- dans le 2nd cas (polymorphisme), la méthode parent est utilisée et complétée.

Héritage Multiple

Une classe peut-être dérivée de plusieurs classes parentes.
Cf. Python Tutorial si nécessaire.

Erreurs fréquentes

Causes possible du message d'erreur : NameError: name 'nom_variable' is not defined

  • oubli du mot clé self devant nom_variable dans la définition de la classe
  • oubli du nom d'instance devant nom_variable dans le programme
  • oubli du mot clé self devant nom_méthode dans la définition de la classe
  • oubli du nom d'instance devant nom_méthode dans le programme

Programmation objet - Résumé

Définition d'une classe

class Nom_classe():

Constructeur

def __init__(self, ...):

Attributs

Attribut d'instance :

  • self.nom_attribut à l'intérieur de la définition de la classe ;
  • nom_instance.nom_attribut dans le programmme.

Attribut de classe :
  • Nom_classe.nom_attribut

Méthodes

Méthode d'instance :

  • self.nom_attribut à l'intérieur de la définition de la classe ;
  • nom_instance.nom_attribut dans le programmme.

Méthode de classe :

Méthode statique :

Héritage

class Nom_classe(Nom_classe_parente):

Constructeur

def __init__(self, ...):
super().__init__(...)

Surcharge

Attribut ou méthode de la classe parent écrasé (redéfini) dans la classe fille.

Polymorphisme

Méthode de la classe parent utilisée et complétée dans la classe fille.

Python Tutorial
Gérard Swinnen (Python 3)