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 :
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.
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).
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.
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)
.
Il est possible de définir des méthodes, liées à la classe, communes à toutes les instances.
Cf. Python Tutorial si nécessaire.
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.
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.
Une classe peut-être dérivée de plusieurs classes parentes.
Cf. Python Tutorial si nécessaire.
Causes possible du message d'erreur : NameError: name 'nom_variable' is not defined
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.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.
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.