Académique Documents
Professionnel Documents
Culture Documents
Paradigme
Un paradigme est une manière de voir les choses, une représentation du monde.
2
Principes de la Programmation Orientée Objets
3
Principes de la Programmation Orientée Objets
Les classes :
Une classe est une structure qui permet de définir différents objets de même type.
4
Principes de la Programmation Orientée Objets
une Classe est comme un plan ou un schéma permettant de créer des objets. Il faut
distinguer :
●
le plan d'une voiture est la classe "Voiture"
●
les différentes constructions à partir de ce plan sont les objets.
●
on appelle chaque construction : instance de la classe Voiture.
Objet1
couleur: vert
modele: peugeot 206
annee_production: 2010
type_carburant: SP95
etat_moteur: arrêt
vitesse : 0 (0 km/h)
Objet2
couleur: jaune
modele: Renault Clio
annee_production: 2012
type_carburant: Diesel
etat_moteur: démarré
vitesse : 90 (km/h)
Les objets : objet1 et objet2 comprennent les méthodes: demarrer(), arreter(), accelerer() et construire().
5
Implémentation d'une classe et création d'objets
On déclare une classe en Python à l'aide du mot-clé class .
Pour déterminer et initialiser les attributs d'un objet que l'on crée, on utilise une méthode
particulière appelée constructeur. En Python, son nom est imposé : __init__
__init__ : constructeur.
Obligatoire, appelé implicitement
à la création d’un objet.
class Voiture:
def __init__(self,coul,mod,annee,carburant,etat,vit):
self.couleur = coul
self : désigne l’objet auquel
self.modele = mod
s’applique la méthode.
Initialisation self.annee_production = annee
des attributs. self.type_carburant = carburant
self.etat_moteur=etat
self.vitesse = vit
Création
de l’objet voiture1 voiture1 = Voiture("vert","peugeot 206","2010","SP95","arrêt",0)
de classe Voiture
6
Implémentation d'une classe et création d'objets
class Voiture:
def __init__(self,coul,mod,annee,carburant,etat,vit):
self.couleur = coul
self.modele = mod
self.annee_production = annee
self.type_carburant = carburant
self.etat_moteur=etat
self.vitesse = vit
Pour accéder à l'attribut d'une instance (ou d'un objet), on utilise la syntaxe suivante :
nom_de_l_instance.nom_de_l_attribut
7
Implémentation d'une classe et création d'objets
Modification de la valeur d’un attribut :
voiture1.couleur = "rouge"
Couleur : rouge
print("Couleur :",voiture1.couleur) Modèle : peugeot 206
print("Modèle :",voiture1.modele)
8
Implémentation d'une classe et création d'objets
Définition des méthodes d’une classe :
Class nom_de_la_classe :
def __init__(self, ……….) : # constructeur de la classe
…
def demarrer(self):
if self.vitesse == 0 and self.etat_moteur == "arrêt":
self.etat_moteur = "démarré"
return "voiture démarrée"
else:
return "Impossible"
def arreter(self):
if self.vitesse == 0 and self.etat_moteur == "démarré":
self.etat_moteur = "arrêt"
9
Implémentation d'une classe et création d'objets
Utilisation des méthodes d’un objet :
voiture1 = Voiture("vert","peugeot 206","2010","SP95","arrêt",0)
print("Démarrage de la voiture")
voiture1.demarrer() # On démarre la voiture
print("Moteur :",voiture1.etat_moteur) # on peut voir que la voiture a démarré.
print("Vitesse :",voiture1.vitesse) # on peut voir que la voiture ne roule pas.
print("--------------------")
Démarrage de la voiture
Moteur : démarré
Vitesse : 0
--------------------------------
Accélération de la voiture de 20 km/h
Moteur : démarré
Vitesse : 20
10
Exercice 1
●
une plante est d’une certaine espèce
●
une plante mesure une certaine taille (un nombre décimal)
●
une plante a un certain âge (nombre entier positif ou nul)
●
une plante a un âge maximal (nombre entier positif ou nul)
●
une plante possède un certain nombre de fleurs (nombre entier positif ou nul)
●
une plante possède un certain nombre de fruit (nombre entier positif ou nul)
●
une plante est capable de pousser (sa taille augmente d’un certain nombre de
centimètres)
●
une plante peut être fanée si son âge dépasse les 90% de son âge maximal
11
Exercice 2
●
un cercle n’a qu’un seul attribut : son rayon. Ce nombre décimal est positif
ou nul
●
on doit pouvoir récupérer ce rayon
●
on doit pouvoir modifier ce rayon
●
on doit pouvoir calculer son périmètre à l’aide d’une méthode
●
on doit pouvoir calculer son aire à l’aide d’une méthode
12
Exercice 3
Dans cet exercice, on étudie une méthode de chiffrement de chaînes de caractères
alphabétiques.
Pour des raisons historiques, cette méthode de chiffrement est appelée "code de César".
On considère que les messages ne contiennent que les lettres capitales de l’alphabet
"ABCDEFGHIJKLMNOPQRSTUVWXYZ" et la méthode de chiffrement utilise un nombre entier
fixé appelé la clé de chiffrement.
Voir Cours.
13
Encapsulation
En définissant la méthode arreter(self) de la classe voiture :
def arreter(self):
on comprend qu'il n'est pas possible que le moteur soit à l'arrêt et que la voiture ait une vitesse
supérieure à 0 km/h.
Pourtant, il est possible de créer cette situation en accédant et modifiant directement les attributs.
14
Encapsulation
Pour utiliser ou modifier les attributs, on utilisera alors de préférence des méthodes
dédiées dont le rôle est de faire l'interface entre l'utilisateur de l'objet et la
représentation interne de l'objet (les attributs).
L'encapsulation permet de :
●
simplifier la vie du programmeur qui les utilise les classes,
●
masquer la complexité des classes,
●
permet de modifier celle-ci sans changer le reste du programme,
●
la liste des méthodes devient une sorte de mode d'emploi de la classe.
15
Encapsulation
En Python pour rendre privé un attribut ou une méthode, il faut préfixer le nom par une paire de `__`.
Comme l'attribut n'est plus accessible de l'extérieur, pour accéder ou modifier sa valeur on utilise deux types
de méthode :
●
Les accesseurs (ou getters) : pour obtenir la valeur d'un attribut. En général, le nom des accesseurs
commence par Get suivi du nom de l'attribut.
●
Les mutateurs (ou setters) : pour modifier la valeur d'un attribut. En général, le nom des mutateur
commence par Set suivi du nom de l'attribut.
Dans l'exemple de la classe `Voiture`, on va rendre privé l'attribut `couleur` et créer un accesseur et un
mutateur pour cet attribut.
def __init__(self, coul, mod, annee, carburant, etat, vit): voiture3 = Voiture("rouge", "renault clio", "2011", "Diesel", "arrêt", 0)
self.__couleur = coul # On change la couleur de la voiture avec le mutateur
self.modele = mod Attribut privé voiture3.SetCouleur("Mauve")
self.vitesse = vit
# On affiche la couleur de la voiture avec l'accesseur
print(voiture3.GetCouleur())
def GetCouleur(self):
"""Accesseur de l'attribut couleur""" # Génère une erreur car l'attribut __couleur est privé donc inaccessible.
return self.__couleur print(voiture3.__couleur)
Accesseur
def SetCouleur(self, coul):
"""Mutateur de l'attribut couleur"""
self.__couleur = coul
…. Mutateur
16
Exercice 4
1. Modifier la classe `Voiture` pour que tous les attributs soient privés. Définir pour
chacun d'eux un accesseur et un mutateur en respectant les règles citées plus haut :
●
pour démarrer la voiture, il faut qu'elle soit à l'arrêt et et que sa vitesse soit nulle. Son
état passe à : "démarré".
●
pour arrêter la voiture, il faut qu'elle soit démarrée et de sa vitesse soit nulle. Elle
passe alors à l'état : "arrêt".
●
pour accélérer la voiture, il faut préciser de combien on accélère la voiture. Une valeur
négative fait ralentir la voiture.
2. Créer une instance de la classe voiture puis modifier certains paramètres et vérifier
que tout fonctionne correctement.
17
Récapitulatif
●
Le type de données avec ses caractéristiques et ses actions possibles s’appelle
classe.
●
Les caractéristiques (ou variables) de la classe s’appellent les attributs.
●
Les actions possibles à effectuer avec la classe s’appellent les méthodes.
●
La classe définit donc les attributs et les actions possibles sur ces attributs, les
méthodes.
●
Constructeur : la manière « normale » de spécifier l’initialisation d’un objet est d’écrire
un constructeur (méthode __init__(self,...)).
●
L’encapsulation désigne le principe de regrouper des données brutes avec un
ensemble de routines (méthodes) permettant de les lire ou de les manipuler.
●
Accesseur ou "getter" : une fonction qui retourne la valeur d’un attribut de l’objet. Par
convention son nom est généralement sous la forme : GetNom_attribut().
●
Un Mutateur ou "setter" : une procédure qui permet de modifier la valeur d’un attribut
d’un objet. Son nom est généralement sous la forme : GetNom_attribut().
●
En Python pour rendre privé une méthode ou un attribut il faut que son nom commence
par la paire de symbole __.
18
Agrégation
Un objet dans la vraie vie, par exemple votre stylo, est composé d’autres objets :
une pointe (ou plume), un réservoir d’encre, éventuellement un capuchon et un
ressort....
Votre stylo est ce qu’on appelle un objet agrégat et son réservoir d’encre est
donc un objet composant.
class Reservoir:
class Stylo:
''' classe permettant de construire un réservoir
''' classe permettant de construire un stylo
d'encre
avec un réservoir d'encre.
pour des stylos toutes marques, toutes dimensions
On ne s'occupe pas de ses autres caractéristiques'''
'''
def __init__(self, couleur):
def __init__(self, couleur):
''' On se contente d'un seul paramètre pour l'exemple
''' On se contente d'un seul paramètre pour
les dimensions ou autres composants ne seront donc
l'exemple
pas inclus dans cette description '''
les dimensions ne seront donc pas incluses dans
self.reservoir = Reservoir(couleur)
cette description '''
# un seul attribut toujours par souci de clarté
# Accesseur du self.couleur de self.reservoir
self.__couleur = couleur
def getCouleur(self):
return self.reservoir.getCouleur()
# Accesseur de self.couleur
def getCouleur(self):
# Mutateur du self.couleur de self.reservoir
return self.__couleur
def setCouleur(self, couleur):
self.reservoir.setCouleur(couleur)
# Mutateur de self.couleur
def setCouleur(self, couleur):
self.__couleur = couleur
19
Agrégation
class Reservoir: class Stylo:
''' classe permettant de construire un réservoir ''' classe permettant de construire un stylo
d'encre avec un réservoir d'encre.
pour des stylos toutes marques, toutes dimensions On ne s'occupe pas de ses autres caractéristiques'''
'''
def __init__(self, couleur):
def __init__(self, couleur): ''' On se contente d'un seul paramètre pour l'exemple
''' On se contente d'un seul paramètre pour les dimensions ou autres composants ne seront donc
l'exemple pas inclus dans cette description '''
les dimensions ne seront donc pas incluses dans self.reservoir = Reservoir(couleur)
cette description '''
# un seul attribut toujours par souci de clarté # Accesseur du self.couleur de self.reservoir
self.__couleur = couleur def getCouleur(self):
return self.reservoir.getCouleur()
# Accesseur de self.couleur
def getCouleur(self): # Mutateur du self.couleur de self.reservoir
return self.__couleur def setCouleur(self, couleur):
self.reservoir.setCouleur(couleur)
# Mutateur de self.couleur
def setCouleur(self, couleur):
self.__couleur = couleur
pen = Stylo("Rouge")
print(pen.getCouleur())
20
Exercice 5 Application à un jeu de cartes
Voir cours :
●
Partie 1 : définition d’un attribut Figure, ...
●
Partie 2 Agrégation
21