En programmation orientée objet, la conception d'un programme se base sur la relation entre plusieurs objets. Ces relations sont construites par les développeurs et constituent ce que l’on appelle l’architecture d’une application.
Ainsi, pour concevoir une application en POO, on se base sur 3 piliers fondamentaux:
Lorsqu'on réfléchit à la conception d'une application, on peut vouloir créer des « sous-classe » qui vont déprendre d'une classe mère et récupérer ses attributs et ses méthodes. Ce mécanisme est appelé l'héritage.
Prenons un exemple avec une classe Animal
, qui se définit par 2 attributs :
class Animal:
def __init__(self, nom, nb_pattes):
self.nom = nom
self.nb_pattes = nb_pattes
Maintenant, on souhaite créer une classe Chien
. Il est possible de dire qu’un chien est un animal.
Animal
est la classe parente de la classe Chien
Chien
est la classe enfant de la classe Animal
.Chien
hérite de la classe Animal
Voici la syntaxe python pour créer une classe qui hérite d'une classe mère.
class Chien(Animal):
def __init__(self, nom, type_poil):
super().__init__(nom, 4)
self.type_poil = type_poil
Regardons un peu en détail les lignes ci-dessus :
Ligne 1 : Elle permet d'indiquer la classe mère. Ici, la classe mère est la classe Animal
.
Ligne 3 : Ici, on redéfinit le constructeur nécessaire pour créer un objet Chien
. On peut ajouter de nouveaux paramètres comme ici avec le paramètre type_poil
.
Ligne 4 : Ici, on utilise l'instruction super().__init__()
.
Lorsqu'une classe hérite d'une autre, il faut s'assurer que le constructeur de la classe parente est appelé pour garantir l’initialisation. Pour cela, Python 3 fournit la fonction super()
qui retourne le type de la classe mère.
Il suffit ensuite d'appeler la fonction __init__
et de préciser la valeur des paramètres de la classe mère.
Chien
pourra utiliser l'attribut type_poil
.La fonction python isinstance
permet d'indiquer la classe d'un objet. Elle prend en paramètre un objet et le nom d'une classe. Elle retourne True
si l'objet passé en premier paramètre est une instance de la classe passée en second paramètre.
>>> a = Animal('Rex', 4)
>>> isinstance (a, Animal)
True
En utilisant l'héritage, la fonction isinstance
renverra True
pour la classe mère et la classe fille
>>> c = Chien('Rex', 'court')
>>> isinstance(c, Animal)
True
>>> isinstance(c, Chien)
True
Le polymorphisme est un mécanisme important de la programmation orientée objet. Il permet de modifier le comportement d'une classe fille en réécrivant les méthodes.
Par exemple dans la classe Animal
, on peut écrire une méthode crier
.
class Animal:
def crier(self):
print("Je fait un cri !")
Avec le mécanisme de l'héritage, on crée également une classe Chien
et une classe Chat
.
class Chien(Animal):
def crier(self):
print('Whaouf !')
class Chat(Animal):
def crier(self):
print('Miaou !')
Les deux classes Chien
et Chat
hérité de la classe Ànimal
, mais on modifie leur comportement en redéfinissant la méthode crier
.
Un chat est bien un animal, un chien est bien un animal.
Les objets de ces types disposent bien de la méthodecrier()
mais son comportement est polymorphe. Il dépend du type réel de l’objet.
Ainsi, il est possible d'appeler la même méthode sur des objets différents et d'avoir un comportement différents.
chien = Chien("Rex", 'court')
chat = Chat('Lulu', 'court')
animaux = [chien, chat]
for a in animaux :
a.crier()
Dans cet exercice, on souhaite construire l'architecture de classe suivante.
On retrouve :
Vehicule
.VehiculeMotorise
et VehiculePietion
qui héritent de la classe Vehicule
.Camion
et Voiture
qui héritent de la classe VehiculeMotorise
.Velo
et Trotinette
qui héritent de la classe VehiculePietion
.Question 1 - Écrire l'ensemble des classes permettant de construire l'architecture logicielle ci-dessus.
demarrer
de la classe Camion
, on ajoutera l'instruction print("Démarage du camion...")
.Question 2 - Tester votre architecture en créant différentes instances d'objets.