Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
PROGRAMMER EN
ORIENTÉ OBJET
2
SOMMAIRE
Appréhender le paradigme de la POO Connaître les principaux piliers de la POO Appliquer la POO dans le langage de
programmation Python
• Ensuite, pour résoudre chaque partie, une ou plusieurs procédures/fonctions sont utilisées
• Dans la programmation procédurale, les notions de données et de traitement de ces données sont
séparées
5
Programmation procédurale
Dans la programmation procédurale:
7
Paradigmes de programmation
Programmation structurée (procédurale )
Paradigmes de programmation
Programmation structurée (traditionnelle ou classique)
Historique de la POO
Par rapport à un langage impératif typé, un objet est l’´équivalent d’une variable
(simple ou structurée) et la classe dont il est l’instance correspond au type de la
variable
Paradigmes de programmation
programmation procédurale :
P.P. (Pascal, C, etc.)
• Pourquoi ne pas considérer que les programmes sont avant tout des ensembles
objets informatiques caractérisé par les opérations qu’ils connaissent?
Les langages orientés objets sont nés pour répondre à ces questions.
Ils sont fondés sur la connaissance d’une seule catégorie d’entités informatiques :
LES OBJETS
1
7
Paradigmes de programmation
La programmation orientée objet, souvent abrégée POO, permet de
concevoir une application sous la forme d'un ensemble de briques logicielles
appelées des objets.
Chaque objet joue un rôle précis et peut communiquer avec les autres objets.
Les interactions entre les différents objets vont permettre à l'application de
réaliser les fonctionnalités attendues.
2
0
Programmation orientée objet
Programmation procédurale
2
1
Programmation orientée objet
Créditer un
compte?
Débiter un
compte?
Comment se
présente (structure)
d’un compte
bancaire ?
2
2
Paradigmes de programmation
Concepts de POO
CHAPITRE 1 1- Programmation procédurale
2- De la programmation procédurale à la POO
INTRODUIRE LA POO 3- Avantages de la POO
4- Historique de la POO
Motivation et avantage de la POO
Motivation : concevoir, maintenir et exploiter facilement de gros logiciels
Avantages:
• Modularité : les objets forment des modules compacts regroupant des données et un ensemble
d'opérations ce qui réduit la complexité de l’application (classe = module)
• Abstraction :
• Les entités objets de la POO sont proches de celles du monde réel (objet est un compte, stagiaire,
formateur, etc.).
• La POO se base sur un processus qui consiste à masquer des détails non pertinents à l’utilisateur.
Exemple:
Pour envoyez un SMS, vous tapez simplement le message, sélectionnez le contact et cliquez sur Envoyer ce
qui se passe réellement en arrière-plan est masqué car il n’est pas pertinent à vous.2
5
Avantages de la POO
Réutilisabilité:
2
6
Avantages de la POO
Avantages
Développement plus facile (et souvent plus rapide)
Fonctionnement plus stable
améliorer la réutilisation des outils existants
s’éloigner de la machine et se rapprocher du problème à résoudre.
développer une approche mieux adaptée à la résolution de problèmes.
Nouvelle façon de penser la décomposition de problèmes et l’élaboration
de solutions.
Maintenance plus simple
Augmentation de la qualité des logiciels (moins de bugs)
Une approche différente pour rapprocher le développement et notre
manière de concevoir le monde
CHAPITRE 1 1- Programmation procédurale
2- De la programmation procédurale à la POO 3
INTRODUIRE LA POO
- Avantages de la POO
4 - Historique de la POO
Historique évolution de la POO
• Les concepts de la POO naissent au cours des années 1970 dans des
laboratoires de recherche en informatique.
2
9
Historique évolution de la POO
• A partir des années 80, les principes de la POO sont appliqués dans de nombreux langages
• Eiffel créé par le Français Bertrand Meyer
• C++ est une extension objet du langage C créé par le Danois Bjarne Stroustrup
• Objective C une autre extension objet du C utilisé, entre autres, par l'iOS d'Apple
• Les années 1990 ont vu l'avènement des PPOs dans de nombreux secteurs du développement
logiciel, et la
création du langage Java par la société Sun Microsystems
• De nos jours, de très nombreux langages permettent d'utiliser les principes de la POO dans des
domaines variés tels que PHP (à partir de la version 5), VB.NET, PowerShell, Python, etc.
3
0
Programmation Orientée Objet
• Comment peut on y arriver?
Introduction des nouvelles (?) notions
objet
classe
instanciation
hiérarchie des classes
héritage
événement
• On va utiliser ces notions pour introduire le paradigme de
programmation orientée objet.
CHAPITRE 2 1- Notion d’objet
DÉFINIR UN OBJET
2- Notion de classe
3– Constructeur/Destructeur
4– Objets en interaction
Notion d’objet
Définition d’un objet
Un objet représente une entité du monde réel, ou de monde virtuel dans le cas
d’objets immatériels, qui se caractérisent par une identité (id), des états (attribut)
significatifs et par un comportement (méthode).
L’identité d’un objet permet de distinguer les objets les uns par rapport aux autres.
Le comportement d’un objet se défini par l’ensemble des opérations qu’il peut
exécuter en réaction aux messages envoyés (un message = demande d’exécution
d’une opération) par les autres objets.
Notion d’objet
OBJET= Référent + Etat + Comportement
• Chaque objet doit avoir un nom (référence) « qui lui est propre » pour l’identifier
• La référence permet d’accéder à l’objet, mais n’est pas l’objet lui-même. Elle contient
l’adresse de l’emplacement mémoire dans lequel est stocké l’objet.
• Mémoire
• @0x304009
0x304009 Objet
Référence P1
Notion d’objet
• Plusieurs référents peuvent référer un même objet→ adressage indirect
Mémoire P1=P2
P1
0x504010 Objet 1
0x504010 Objet 2 P1
P2
Mémoire des objets 0x504010 Objet 2
P2
Recopie l’adresse de P2
dans le réfèrent de P1 Mémoire des objets
Notion d’objet
Exemple d’objets où chaque attribut est d’un type dit «primitif » ou « prédéfini », comme entier, réel, caractère…
Attribut Valeur
Première_Voiture
Couleur=rouge
0x304009
Marque=Peugeot
Deuxième_Voiture
Couleur=Noir
0x304021
Marque=Citroën
Premier-Arbre-Dans-Larue
Type: Citronnier
0x304100
Hauteur: 2
Première_Voiture:
Première_Voiture Objet composite
0x304009 Couleur=rouge
Marque=Peugeot
Moteur1 Moteur1:
Moteur=Moteur1
0x304021 Objet composant
Puissance=100
Marque=XX
Feu_de_signalisation_EnQuestion
Couleur=1
0x304021
Couleur=2
Couleur=3
– LES METHODES
Feu_de_signalisation
_EnQuestion Change()
0x304021 Couleur=1
Couleur=Couleur+1
If(Couleur==4)
Couleur=1
Notion de classe
Une classe est la description d'une famille d'objets qui ont la même
structure et les mêmes comportements.
Nom
Attributs
méthodes
Notion de classe
4
7
Une classe est la généralisation de la notion de type défini par l’utilisateur
Classe : association à la fois les données et les fonctions
Les objets sont des instances de classes. Ils possèdent les mêmes
caractéristiques que les variables ordinaires
Pour créer un objet, il faut d'abord créer une classe
Avion_airbus a380
Classe Avion
objet1 Etat= En VOl
Avion Contenu réservoir= 40l
instanciation Atterrir()
Attributs EtatContenuRéservoir
instanciation Avion_airbus a320
Méthodes Etat= Au Sol
Atterrir() objet2
ContenuRéservoir= 25l
Atterrir()
4
9
Objet: instance d’une classe
• Chaque objet correspond à une instance de la classe à laquelle il fait
référence
• La création d’un objet est constituée de deux phases:
• Une phase de ressort de la classe: allouer de la mémoire et un
contexte d’exécution minimaliste.
• Une phase du ressort de l’objet: initialiser ses attributs d’instances
• Dans les langages, ces deux phases ne sont pas différenciées.
→ Appel à une méthode spéciale : le constructeur
5
0
Objet: instance d’une classe
Appel d’une méthode d’une classe instanceDeClasse.méthode()
Change()
Mémoire des objets
Feu_de_signalisation_EnQuestion.change()
Feu_de_signalisation_EnQuestion Application de la méthode change() définie
dans la classe Feu_de_Signalisation
0x304021 Couleur=2
L’instruction pass
la définition d’une classe ne peut pas être vide, mais si pour une raison
quelconque vous avez une définition de classe sans contenu, insérez
l’instruction pass pour éviter d’obtenir une erreur.
Conventions
Prenez l'habitude de nommer votre classe uniquement avec des caractères
alphanumériques et commençant par une majuscule. Et à l'inverse l'instance
peut être nommée sans majuscule.
Notion de classe
Cette ligne veut tout simplement dire : “crée un objet (une instance) de la
classe Voiture que l’on nommera peugeot407.”
Ensuite, rien ne nous empêche de créer une deuxième instance de la classe Voiture :
Notion de classe
Les attributs
Un attribut est une variable associée à une classe.
Pour définir un attribut au sein d’une classe , il suffit :
-d’assigner une valeur à cet attribut dans le corps de la classe :
En Exécution
Un autre exemple de classe
Notion de classe
Les méthodes
Dans notre classe on pourra aussi ajouter des fonctions.
Définition :
Une fonction définie au sein d’une classe est appelée méthode.
Pour exécuter une méthode à l’extérieur de la classe,
la syntaxe générale est instance.méthode().
Voici un exemple d’ajout d’une fonction, ou plus exactement d’une méthode, au sein d’une
classe (attention à l’indentation !) :
Note:
Sache que tu n'es pas obligé d'utiliser explicitement le mot self car
en réalité ce n'est pas un mot réservé en Python.
Si tu viens d'un autre langage de programmation comme
JavaScript, tu as peut-être l'habitude d'utiliser this.
En Python, on utilise le mot self par convention
Notion de classe
Les attributs de classe
Si on ajoute une variable dans une classe comme on créait une variable
locale dans une fonction, on crée ce qu’on appelle un attribut de classe :
Définition :
Une variable de classe ou attribut de classe est un attribut qui sera identique
pour chaque instance. On verra que de tels attributs suivent des règles différentes par
rapport aux attributs d’instance.
Une variable de classe est une variable qui est partagée par toutes les instances de ta
classe.
Dans notre classe Velo, la variable roues est une variable de classe. Ce qui est plutôt
logique car tous les vélos ou presque roulent sur deux roues et pas plus
De l'autre côté, on a les variables d'instances dont les valeurs diffèrent d'une
instance à une autre.
Membre de classe vs membre d’instance
Un membre est un attribut ou une méthode. Il existe 2 types de membres (de classe/d’instance)
6
4
Membre de classe vs membre d’instance
Exemple: Classe Avion
la classe Avion suivante
Avion
6
5
Exercice 1
1. Créer la classe Stagiaire avec les attributs suivants : numins, nom, prenom, dateNaissance
et le nombre de stagiaire.
2. Instancier 2 objets de type Stagiaire .
3. Demander à l’utilisateur de saisir les informations du deuxième objet.
4. Afficher les informations des ces deux Stagiaire
5. Créer la classe Saluer avec la méthode dire qui affiche un texte pour le paramètre nom
6. Instancier 1 objet de type Saluer
7. afficher le texte « bonjour » à le nom « Ali »
8. Créer un docstring pour la classe Saluer (texte expliquant la classe)
9. Afficher le docstring de la classe Saluer.
10.Afficher le texte « bonjour » à un objet de la classe personne
Exercice 1
1. Créer la classe Stagiaire avec les attributs suivants : numins, nom, prenom, dateNaissance et le nombre de stagiaire.
Un autre exemple de classe
Les docstrings sont des chaines de doc qui doivent être placées juste en dessous des définitions de
fonction ou de classe, ou bien tout en haut d'un module.
L'intérêt, c'est que les docstrings sont récupérables dynamiquement via l'attribut __doc__, ou grâce à la
fonction primitive help( ). Ça permet notamment de faire de la documentation autogénérée :
CHAPITRE 2 1- Notion d’objet
2- Notion de classe
DÉFINIR UN OBJET
3- Constructeur/Destructeur
4- Objets en interaction
Lors de l'instanciation d'un objet à partir d'une classe, il peut être intéressant
de lancer des instructions comme par exemple initialiser certaines variables.
Pour cela, on ajoute une méthode spéciale nommée .__init__() : cette
méthode s'appelle le « constructeur » de la classe : en effet, elle sert au
fonctionnement interne de notre classe
le constructeur est appelé lors de la création d'un nouvel objet. Il s'agit en
fait d'une méthode particulière dont le code est exécuté lorsqu'une classe
est instanciée.
Ce constructeur est exécuté à chaque instanciation de notre classe, et ne
renvoie pas de valeur, il ne possède donc pas de return.
Constructeur
Le constructeur d'une classe est une méthode appelée une seule fois par objet et au
moment de sa création
Le constructeur se définit dans une classe comme une fonction avec deux particularités :
le nom de la fonction doit être __init__ ;
la fonction doit accepter au moins un paramètre, dont le nom doit être self, et qui
doit être le premier paramètre.
Le paramètre self représente en fait l'objet cible, c'est-à-dire que c'est une variable qui
contient une référence vers l'objet qui est en cours de création. Grâce à ce dernier, on
va pouvoir accéder aux attributs et fonctionnalités de l'objet cible.
Le rôle du constructeur est d'initialiser les attributs de l'objet Donc init() représente le
code d’initialisation.
Syntaxe
def __init__(self, liste_parameters):
# Initialisiation 7
2
Constructeur
Modifions la classe Personne en lui ajoutant un constructeur qui permet de
créer une nouvelle Personne en renseignant son cin ,son prénom, son nom
et année de naissance
La classe Personne, telle qu'elle est pour le moment, n'est pas encore des plus utiles car
les variables contiennent tout simplement une référence vers l'objet qui a été créé,
c'est-à-dire une indication sur son emplacement en mémoire.
En effet, il serait souhaitable de pouvoir stocker les informations de la classe Personne
dans l'objet qui a été créé. c'est-à-dire avoir des attributs stockant les informations du
contact cd sont Variable d'instance accessible à l'aide du paramètre self
Constructeur
L'idée est que le constructeur initialise ces variables d'instances, qui seront alors stockées
dans l'objet et en mémoire pour toute la durée de vie de l'objet. On modifie donc le
constructeur de la classe Personne en :
Constructeur
Il est important de faire la différence entre les deux types de variables qui
se trouvent dans le code de ce constructeur :
la variable self.nom représente la variable d'instance, c'est-à-dire celle
associée à l'objet, qui existe à partir de la création de l'objet jusque sa
destruction ;
la variable nom représente le paramètre reçu par le constructeur et
n'existe que dans le corps de ce dernier.
Le paramètre self permet donc d'accéder aux variables d'instance, c'est-
à-dire aux attributs de l'objet cible, depuis le constructeur.
75
Constructeur
Imaginons que tu sois fan de cyclisme et que tu veuilles créer un programme pour
gérer ta dépendance dévorante au short moulant :
La différence entre une variable
d'instance et une variable de classe
histoire
Attribut d ‘ instance
Attribut d ‘ instance
Attribut d ‘ instance
Constructeur
Résume
La méthode constructeur (Constructor):
Le constructeur (constructor) est une méthode spéciale de classe, elle
est toujours nommé init
Le premier paramètre du constructeur est toujours self (un mot-clé se réfère à la classe
elle-même).
Le constructeur est utilisé pour créer un objet.
Le constructeur attribue des valeurs du paramètre aux propriétés de l'objet qui sera créé.
Vous ne pouvez définir qu'un plus constructeur en classe.
Si la classe n'est pas définie par le constructeur, par défaut Python considère qu'il a un
constructeur par défaut init (self), avec le corps vide, il hérite le constructeur de la
classe parente.
78
Constructeur
Affichage d’objet
79
Constructeur
Représentation de l’objet : deux méthodes spéciales permettent de contrôler
comment l’objet est représenté et affiché.
La méthode repr affecte la façon dont est affiché l’objet quand on tape
directement son nom. On la redéfinit quand on souhaite faciliter le debug sur
certains objets.
La méthode str est appelée pour afficher l’objet avec print (sinon repr )
ou pour convertir l’objet en chaîne de caractères.
Destructeur
• Le destructeur est une méthode qui permet la destruction d'un objet non référencé.
• Un destructeurs permet:
• Gérer les erreurs
• .Libérer les ressources utilisées de manière certaine
• Assurer la fermeture de certaines parties du code.
• Les langages qui utilisent des ramasse-miettes (exemple Python) n'offrent pas le mécanisme
des destructeurs puisque le programmeur ne gère pas la mémoire lui-même
• Un ramasse-miettes est programme de gestion automatique de la mémoire. Il est
responsable du recyclage de la mémoire préalablement allouée puis inutilisée.
8
1
Destructeur
En Python, les destructeurs ne sont pas aussi nécessaires que en C++, car
Python dispose d'un ramasse-miettes qui gère automatiquement la gestion de
la mémoire.
Les méthodes se définissent comme des fonctions, avec le mot clé def, sauf
qu'elles se trouvent dans le corps de la classe.
On construit une instance de classe grâce à son constructeur, une méthode
appelée __init__.
Les méthodes prennent en premier paramètre self, l'instance de l'objet
manipulé.
On définit les attributs d'une instance dans le constructeur de sa classe, en
suivant cette syntaxe : self.nom_attribut = valeur.
On peut accéder aux attribut d'un objet avec l'opérateur . en suivant cette
syntaxe: valeur = nom_objet.nom_attribut
CHAPITRE 2 1- Notion d’objet
2- Notion de classe
DÉFINIR UN OBJET 3- Constructeur/Destructeur
4- Objets en interaction
Objets en interaction
8
5
Objets en interaction
• Supposons que le feu « Feu_de_signalisation_EnQuestion1 » fasse ralentir ou accélérer la voiture « Voiture-Devant »
• Objet Feu_de_signalisation_EnQuestion est l’expéditeur de message
• Objet Voiture-Devant est le destinataire de message
Feu_de_signalisation_EnQuestion1 Change()
0x304021 Couleur=3 Couleur=Couleur+1
If(Couleur==4) Couleur=1
If (couleur==1)……….
Voiture-Devant.ChangeVitesse(50)
Voiture-Devant
ChangeVitesse(int nV)
0x30502 Vitesse=0
Vitesse=nV
8
6
Exercice
1. Créer une classe Python nommée CompteBancaire qui représente un
compte bancaire, ayant pour attributs : numeroCompte (type numérique )
, nom (nom du propriétaire du compte du type chaîne), & solde.
2. Créer un constructeur ayant comme paramètres : numeroCompte, nom,
solde.
3. Créer une méthode Versement() qui gère les versements.
4. Créer une méthode Retrait() qui gère les retraits.
5. Créer une méthode Agios() permettant d’appliquer les agios à un
pourcentage de 5 % du solde
6. Créer une méthode afficher() permettant d’afficher les détails sur le
compte
7. Afficher les détails d un compte en utilisant La méthode str
8. Donner le code complet de la classe CompteBancaire.
CHAPITRE 3
1- Principe de l’encapsulation
CONNAITRE 2- Niveaux de visibilité
L’ENCAPSULATION
Encapsulation
Dans un programme contenant la définition d'une classe, on peut distinguer le code se
trouvant à l'intérieur de la classe (donc dans le corps de ses méthodes) et celui qui
se trouve à l'extérieur (instructions ne figurant dans aucune méthode de la classe).
L'encapsulation est une manière de définir une classe de telle sorte que ses attributs
ne puisse pas être directement manipulés depuis l'extérieur, mais seulement
indirectement par l'intermédiaire de ses méthodes.
Un des avantages de cette approche est la possibilité de redéfinir la représentation
interne des attributs, sans que cela affecte la manipulation externe d'un objet de cette
classe.
L'encapsulation facilite donc la mise à jour des applications. On peut en voir l'intéret
dans un projet de développement réalisé par plusieurs développeurs (ce qui est
généralement le cas en entreprise). Chaque développeur est responsable d'une partie
du projet. Si les classes dont il est le responsable sont proprement encapsulées, il
pourra modifier par la suite leurs représentations internes, sans que cela perturbe le
travail des autres développeurs du projet susceptibles d'utiliser ces classes.
90
Principe de l’encapsulation
• L’encapsulation est le fait de réunir à l'intérieur d'une même entité (objet)
le code (méthodes) + données (attributs).
• Il est donc possible de masquer les informations d'un objet aux autres
objets
Encapsulation
92
Principe de l’encapsulation
• L’encapsulation consiste donc à masquer les détails d’implémentation d’un objet, en
définissant une interface.
• L’interface est la vue externe d’un objet, elle définit les services accessibles (Attributs
et méthodes) aux utilisateurs de l’objet. Public
Interface
interface = liste des signatures des méthodes accessibles
Attributs
Privé
Interface = Carte de visite de l’objet
Méthodes
Objet
9
3
Intérêt de l’encapsulation
• Les objets restreignent leur accès qu’aux méthodes de leur classe
Compte Attributs
privés
Numéro de compte;
• Cela permet d’avoir un contrôle sur tous les accès.
solde
Exemple:
Les attributs de la classe compte sont privés retirer() déposer()
par un client qu’à travers les méthodes retirer() et déposer() qui sont publiques
• Publique: les fonctions de toutes les classes peuvent accéder aux données ou aux méthodes d'une classe
définie avec le niveau de visibilité publique
• Privé: l'accès aux données est limité aux méthodes de la classe elle-même
membres publics :
•Les attributs publiques d'une classe sont donc accessibles (en lecture ou en
écriture) depuis n'importe quelle méthode.
•Les méthodes publiques d'une classe peuvent être appelées par n'importe
quelle méthode.
Une classe est encapsulée, si tous ses attributs sont privés.
Encapsulation
En Python, un membre est privé si son nom débute et ne se termine pas par deux caractères
soulignés. Dans le cas contraire il est publique.
Exemple:
__solde est un attribut privé, alors que solde est publique.
Le constructeur de toute classe __init__ est publique car il se termine par deux caractères
soulignés.
98
Encapsulation
Exemple de classe encapsulé en python
class CompteBancaire:
def __init__(self, idNumber, nomPrenom,solde):
self.__numcompte = idNumber
self.__nomPrenom = nomPrenom
self.__solde = solde
Il n’est alors plus possible de faire appel aux attributs __numcompte , __nomPrenom
et __solde depuis l’extérieur de la classe CompteBancaire.
l faut donc disposer de méthodes qui vont permettre par exemple de modifier ou d’afficher les
informations associées à ces variables appelées des accesseurs (Getter ) et mutateurs (Setter)
Getter : Une méthode qui permet d' accéder à un attribut dans une classe donnée
Setter : une méthode qui vous permet de définir ou de modifier la valeur d'un attribut dans une
classe
Encapsulation
Principe des accesseurs et mutateurs
L'encapsulation d'une classe interdit d'accéder à ses attributs depuis l'extérieur,
mais elle autorise d'y accéder indirectement via des accesseurs.
Les accesseurs sont des méthodes qui permettent de retourner la valeur d’un attribut.
Une convention souvent utilisée en programmation objet est de nommer ces méthodes
par get suivi du nom de l'attribut (getter).
Exemple, la méthode get_nom joue ce rôle. Elle nous permet d'obtenir la valeur de
l'attribut nom. Comme les accesseurs en lecture doivent retourner une valeur (celle de
l'attribut associé) ce sont donc nécessairement des méthodes de type fonction
Les mutateurs permettent de modifier la valeur d’un attribut. Ce sont des méthodes de
type procédure, prenant en paramètre la nouvelle valeur de l'attribut. On trouve ici
également une convention fréquemment utilisée pour nommer ces méthodes: elles
commencent par set et sont suivies du nom de l'attribut associé (setter).
Exemple, la méthode setnom joue le rôle d'un accesseur en écriture. C'est l'accesseur
en écriture de l'attribut nom
1.Rajoutez des accesseurs permettant
de récupérer la masse d'un objet.
2.Rajoutez des mutateurs permettant de
modifier la masse d'un objet.
Encapsulation
@property est un décorateur intégré en langage python qui est utilisé pour faire en sorte que des
fonctions telles que les getters et les setters dans une classe se comportent comme des propriétés de
classe.
Le décorateur python @property permet d’accéder à une méthode en tant qu’attribut plutôt qu’en tant
que méthode ou fonction.
Il est recommandé d’utiliser le décorateur @property qui facilite la déclaration d’une propriété au lieu
d’appeler la fonction property().
@Property est un décorateur intégré pour la fonction property() en Python. Il est utilisé pour ajouter des
fonctionnalités « spéciales » à certaines méthodes pour les faire agir comme des getters, des setters ou des
deleters lorsque nous définissons des propriétés dans une classe. 111
Les méthodes de classes et statiques en python
la méthode d’instance
prend en paramètre self , qui pointe vers l’instance de l’objet qui a appelé la
méthode.
la méthode d’instance a accès aux états de la classe et de l’instance et elle prend
comme paramètre self ou l’instance
Pour créer une méthode de classe, il faut la faire précéder d’un «décorateur»
: @classmethod
La méthode de classe est appelé sur l'objet Classe lui-même (et donc,
effectivement, n'utilise pas d'objet instancié).
Utilisation des méthodes de classe
L'exemple le plus canonique d'une méthode de classe intégrée est dict.fromkeys.
Il est utilisé comme un constructeur alternatif de dict, (bien adapté lorsque vous
savez quelles sont vos clés et que vous voulez une valeur par défaut pour elles.)
Un autre exemple
Soit une classe Etudiant ayant des attributs nom, note et date d‘admission.
Le constructeur prend la date d’admission sous la forme d’une année, d’un mois et
d’un jour. Certains utilisateurs fournissent les informations dans ce format, mais
d’autres donnent la date d’admission sous forme de chaîne de caractère «JJ-MM-
AAAA».
Pour la forme chaîne, nous utiliserons une méthode de classe comme
constructeur alternatif, ce qui permettra à nos utilisateurs d’entrer des informations
comme ils le souhaitent.
Utilisation des méthodes de classe
Exemple3
Si on veut avoir le nombre d'instances, tout ce qu'on doit faire est comme suivant
Utilisation des méthodes Statiques
Les méthodes statiques sont utilisées pour créer des fonctions utiles. Ces méthodes ont
une connexion logique avec la classe, mais n’utilisent pas l’état de la classe ou de
l’objet.
méthodes utiles car elles ne sont généralement pas liées au cycle de vie d’un objet.
Une méthode statique est une méthode qui ne sait rien de la classe ou de l'instance à
laquelle elle a été appelée. Il obtient juste les arguments qui ont été passés, pas de
premier argument implicite.
Les méthodes statiques n'ont pas besoin d'être invoquées sur l'objet et c'est à ce moment-là
que vous l'utilisez.
Exemple: votre Main () est statique et vous ne créez pas d'objet pour l'appeler.
Une "méthode statique" sera une fonction rangée dans une boîte "class" (plutôt que dans
une boîte "module"). Comme pour les méthodes de "class" pas besoin d'instancier un objet de
la classe pour pouvoir l'appeler: la différence sera qu'elle ne recevra pas la classe en premier
argument.
L'autre différence est qu'on pourra surcharger une méthode de classe (dans une s/classe)
alors que ce sera plus difficile pour une fonction statique puisqu'il faudra désigner
explicitement sa classe.
Exemple
On va ajouter une méthode statique qui prend la moyenne d’un étudiant et affiche une
observation. Cette méthode a une connexion logique avec la classe Etudiant, mais n’utilise
pas ses propriétés ou ses méthodes.
Exercice 4 :
Un Article caractérisé par les champs (privée) suivants:
Numéro
Description
prixUnitaire
AnneeExpiration
4) Utiliser Le décorateur python @property pour pouvoir accéder aux méthodes en tant qu’attribut
5) Ajouter un constructeur sachant qu’à la création d'un article, on doit renseigner le numéro, la description, le prix Unitaire
ainsi que la date d’expiration.
6) Ajouter la méthode AfficherDetails() : qui affiche les détails de l'article
7) Ajouter la méthode EffectuerReduction(taux): qui permet de baisser le prix de l'article selon le taux donné en paramètres.
8) Ajouter la méthode EstPerime() : qui retourne true si l'article est périmé, false sinon.
9) Tester la classe Article :
Créer deux articles et tester les méthodes déclarées.
Créer une liste qui contient 10 articles dont ses attributs sont saisis par l’utilisateur.
PARTIE 2
CONNAÎTRE LES
PRINCIPAUX PILIERS DE
LA POO
CHAPITRE 4
1- Principe et intérêt de l’héritage
DÉFINIR L’HÉRITAGE ET 2- Types de l’héritage
LE POLYMORPHISME
3- Redéfinition des méthodes
4- Principe du polymorphisme
Définition
L'héritage est un principe propre à la programmation orientée objet.
Le nom d’héritage provient du fait que la classe dérivée (la classe nouvellement créée) contient les
attributs et les méthodes de sa superclasse (la classe dont elle dérive).
L'intérêt majeur de l'héritage est de pouvoir définir de nouveaux attributs et de nouvelles méthodes
pour la classe dérivée, qui viennent s'ajouter à ceux et celles héritées.
Exemple :
Supposons que nous avons une classe Personne contenant les informations et fonctionnalités reliées à un individu.
Un étudiant est une personne, mais il possède des informations que certains n’ont pas, comme le domaine d’études ou université
d’attaché
Principe de l’héritage
Exemple:
Considérons la définition des 3 classes Personne, Etudiant et Employé suivantes:
Exemple:
méthodes
1
3
4
Héritage en cascade Personne
Nom
•Une classe sous-classe peut être elle-même CIN
dateNaiss
une super-classe age()
Etudiant
•Exemple:
note1
Etudiant hérite de Personne note2
Moyenne()
EtudiantDeuxièmeCycle hérite de Etudiant
Valeur de retour:
La fonction isinstance() renvoie True si l’objet est une instance ou une sous-classe d’une
classe, ou tout élément du tuple, sinon renvoie False.
Exemple
if isinstance (e,EtudiantDeuxiemeCycle):
print("e est un objet de la classe EtudiantDeuxiemeCycle")
Fonction issubclass()
La fonction issubclass() renvoie True si l’objet spécifié est une sous-classe de l’objet spécifié,
sinon renvoie False.
Paramètres:
Syntaxe: La fonction issubclass() prend deux paramètres:
Issubclass (object, type) object – objet à vérifier
type – classe, type ou tuple de classes et de types
Valeur de retour
La fonction issubclass() renvoie True si l’objet est une instance ou une sous-classe d’une
classe, ou tout élément du tuple, sinon renvoie False.
Exemple
if issubclass (EtudiantDeuxiemeCycle,Etudiant):
print("EtudiantDeuxiemeCycle est une sous classe de la classe Etudiant")
CHAPITRE 4
1- Principe et intérêt de l’héritage
DÉFINIR L’HÉRITAGE 2- Types de l’héritage
ET 3- Redéfinition des méthodes
LE POLYMORPHISME
4- Principe du polymorphisme
Redéfinition des méthodes héritées
• Une méthode héritée peut être redéfinie si sa version initiale n'est pas satisfaisante
pour la classe dérivée
• Si une méthode héritée est redéfinie, c'est uniquement la nouvelle version qui fait
parti de la description de la classe dérivée
age()
• La méthode afficher() de la classe Personne affiche les afficher()
attribut Nom, CIN d’une personne
Surcharger un attribut
class MaClasseFille(MaClasseMere):
def __init__(self):
MaClasseMere.__init__(self)
self.attribut_classe_mere = 'nouvelle valeur'
Redéfinition des méthodeshéritées: Surcharge
Surcharger une méthode
Tout comme pour les attributs, pour surcharger une fonction, il suffit de la redéfinir.
On peut toutefois vouloir qu’une méthode d’une classe fille n’ait pas le même
comportement que son équivalent dans la classe mère. On redéfinit alors simplement
la méthode dans la classe fille. On parle de polymorphisme et cette technique relève
de la surcharge de méthode, ou en anglais overriding.
Exemple:
def infos_mag (self):
return super(Vetement, self).infos_mag(), "La specialite {}".format(self.specialite)
Mécanisme de la liaison retardée
• Soit C la classe réelle d'un objet o à qui on envoie un message « o.m() »
• o.m() peut appeler la méthode m() de C ou de n’importe quelle sous-classe de C
• Si le code de la classe C contient la définition (ou la redéfinition) d’une méthode m(),
c’est cette méthode qui sera exécutée
• Sinon, la recherche de la méthode m() se poursuit dans la classe mère de C, puis dans la
classe mère de cette classe mère, et ainsi de suite, jusqu’à trouver la définition d’une
méthode m() qui est alors exécutée
Mécanisme de la liaison retardée
Exemple:
Soit etc1 un objet de type EtudiantTroisièmeCycle
Etudiant Etudiant
Afficher() de la
afficher()
classe Personne
est exécutée
Afficher() de la classe
EtudiantTroisièmeCycle est
EtudiantTroisième EtudiantTroisième
exécutée Cycle
Cycle
etc1.afficher() afficher()
CHAPITRE 4
DÉFINIR L’HÉRITAGE ET 1- Principe et intérêt de
LE POLYMORPHISME l’héritage
2- Types de l’héritage
3- Redéfinition des méthodes
4- Principe du polymorphisme
Principe de polymorphisme
“Polymorphisme” signifie littéralement “plusieurs formes”.
Dans le contexte de la programmation orientée objet, le polymorphisme est un
concept qui fait référence à la capacité d’une variable, d’une fonction ou d’un objet
à prendre plusieurs formes, c’est-à-dire à sa capacité de posséder plusieurs
définitions différentes.
Attention
le polymorphisme peut désigner deux choses différentes: le fait de définir des
méthodes différentes pour des classes qui héritent l’une de l’autre (overriding) mais
aussi le fait de définir plusieurs fois la même méthode (ou fonction) avec des
arguments différents (overloading).
Le second cas est plus naturel dans des langages de programmation typé
statiquement (Java, C++, …) et est assez éloigné de la philosophie de Python. Nous
n’en parlerons donc pas ici.
Principe de polymorphisme
• Le polymorphisme désigne un concept de la théorie des types, selon lequel un nom d'objet peut désigner
des instances de classes différentes issues d'une même arborescence
Exemple: Une instance de Etudiant peut « être vue comme » une instance de Personne (Pas l’inverse!!)
• p = e autorisé car le type de p est plus générique que le type de e Objet de Type Etudiant
Type A a1 0x304021 A
MethodeA()
Type B b1 0x304055
Type A a2 0x304555 B
Travail à réaliser
1) Définir la classe Personne.
2) Ajouter un constructeur paramétré qui initialise tous les attributs de la classe Personne.
3) Ajouter les accesseurs et les mutateurs de chaque attribut.
4) Ajouter une méthode __str()__ qui retourne l’état (valeurs des attributs) d’une instance de la classe
Personne
5) Soit la classe Stagiaire qui hérite de la classe Personne et qui a comme attribut :
numéroInscription st1
Moyenne générale CIN :BH14501
Nom :benani.Ahmad
1) Définir la classe Stagiaire. dateNaissance : 2000
numéroInscription : NTIC85
2) Ajouter un constructeur qui initialise tous les attributs de la classe Stagiaire. Moyenne générale : 15,86
3) Redéfinir la méthode __str()__ pour retourner l’état d’un stagiaire.
Exercice 3 (suite)
Partie B
On dérive la classe Personne déjà développée par une classe formateur.
En plus des données membres individu, la classe Formateur a comme données membres privés :
•Masse horaire effective (MH) .
•Heure supplémentaire (HS) .
•Taux horaire effectif (THE) .
•Taux horaire supplémentaire (THS)
1. Ecrire un constructeur paramétré et redéfinir la méthode affichage.
2. La méthode calculSalaire() intègre un mode de calcul comme suit :
calculSalaire = (Masse horaire effective* Taux horaire effectif)+( Heure supplémentaire* Taux horaire supplémentaire)
3. Dans le test :
•Prévoir deux formateurs et les instancier avec les constructeurs adéquats
•Les afficher et calculer leurs salaires.
Exercice 3 (suite)
Partie C
On souhaite enregistrer des objets personnes dans une liste de type personne:
1. Créer une classe Etablissement avec une liste de type personne qui contient des objets personne
2. Ecrire des procédures de mise à jour de cette liste :
Ajout
Modification
Suppression
Recherche
Affichage de tous les stagiaires et tous les formateurs
3. Dans le test, créer le menu suivant :
------------Menu---------
1. Ajouter
2. Modifier
3. Supprimer
4. Rechercher
5. Afficher
6. Quitter
------------------------
Exercice 4 :Héritage multiple
a) Créer la classe objet comprenant :
– les données membres : montant (float), type (chaîne de caractères)
– un constructeur initialisant les données membres
– une fonction affiche qui affiche les informations sur l’objet assure
b) Créer une classe ordinateur dérivant de la classe objet comprenant :
– les données membres : ram (int), hd(int)
– un constructeur initialisant les données membres
– une fonction affiche qui affiche les informations sur l’ordinateur et qui appelle la fonction affiche de la
classe objet assure
c) Créer une classe bagage dérivant de la classe objet comprenant :
– les données membres : type (chaîne de caractères), poids (float)
– un constructeur initialisant les données membres
– une fonction affiche affichant les informations sur le bagage et appelant la fonction affiche de la classe
objet assure.
d) Créer une classe ordinateur portable dérivant des classes ordinateur et bagage et comprenant :
– les données membres poids (float) et epaisseur (float)
– un constructeur initialisant les données membres
– une fonction affiche qui affiche les informations sur l’ordinateur portable et qui appelle les fonctions
affiche des classes bagage et ordinateur
e) Créer un programme qui crée un objet ordinateur portable et qui affiche les informations sur cet objet
CHAPITRE 5
1- Les exceptions
Les exceptions
Les exceptions sont les opérations qu’effectue un interpréteur ou un
compilateur lorsqu’une erreur est détectée au cours de l’exécution d’un
programme. En règle générale, l’exécution du programme est
interrompue, et un message d’erreur plus ou moins explicite est affiche.
Une exception est un objet qui contient des informations sur le contexte
de l’erreur. Lorsqu’une exception survient et qu’elle n’est pas traitée alors
elle produit une interruption du programme et elle affiche sur la sortie
standard un message .
Il existe un très grand nombre d’exceptions organisées de façon
structurée et hiérarchique
Les exceptions
Python n’étant pas un langage compilé, les erreurs dans la rédaction du
code ne sont détectées que pendant la phase d’exécution et
déclenchent des exceptions
La plupart des exceptions toutefois ne sont pas prises en charge par les
programmes, ce qui génère des messages d’erreurs comme celui-ci :
Il arrive d’avoir besoin de générer un type d’erreur personnalisé qui ne figure pas parmi
les différentes classes d’exception du langage Python.
Par exemple, le fait de saisir une note d’examen non valide ∈/[0 ;20] par exemple
1
7
4
Classes et méthodes abstraites
le module abc
Le module abc de Python fournit les fonctionnalités pour définir et utiliser des
classes abstraites.
le module abc donne accès à la classe ABC (Abstract Base Class: classes de bases
abstraites qui permet par héritage de construire une classe abstraite, et au décorateur
@abstractmethod pour définir des méthodes abstraites.
par exemple :
from abc import ABC
class maclasseABC(ABC):
pass
1
7
5
Classes et méthodes abstraites
Exemple:
Forme Classe abstraite
• Sachant que toutes les formes possèdent les
X, Y
propriétés périmètre et surface, il est judicieux Déplacer()
de placer les méthodes définissant ces propriétés Surface()
Méthodes abstraite
Périmètre()
(périmètre()et surface()) dans la classe qui est à
la racine de l'arborescence (Forme)
• Une sous-classe d'une classe abstraite ne peut être instanciée que si elle redéfinit
chaque méthode abstraite de sa classe parente et qu'elle fournit une
implémentation(un corps) pour chacune des méthodes abstraites.
• Si une sous-classe d'une classe abstraite n'implémente pas toutes les méthodes
abstraites dont elle hérite, cette sous-classe est elle-même abstraite (et ne peut donc
pas être instanciée)
TP1 : Classe abstraite
Une société vend des Articles de papeterie. Un Article a une marque et un prix unitaire.
Cette société vend :
1. des Stylos (qui sont des Articles) décrits par une couleur.
2. des Ramettes (qui sont aussi des Articles) décrits un grammage et une couleur (e.g. 80/m2).
Un Article a une méthode permettant de calculer une référence. Cette référence, de type String,
dépend du type de l'article : par exemple, pour un Stylo, la référence sera : "marque:stylo:couleur".
Identiquement, pour une Ramette, ce sera : "marque:ramette:grammage:couleur".
Écrire les classes Article, Stylo et Ramette suivant ces spécifications :
Article est une classe abstraite.
La (seule) méthode abstraite de cette classe est celle du calcul de référence :
Un Article se construit avec une marque et un prix unitaire.
Un Stylo se construit avec une marque, une couleur et un prix unitaire.
Une Ramette se construit avec une marque, un grammage, une couleur et un prix unitaire.
Pensez aux accesseurs.
Pensez au __str__().
TP2 : Classe abstraite
Soit la classe abstraite Employé caractérisée par attributs suivants : Matricule, Nom, Prénom, Date de naissance
La classe Employé doit disposer des méthodes suivantes :
un constructeur d’initialisation des propriétés pour les différents attributs
la méthode __str()__
une méthode abstraite GetSalaire.
Un ouvrier est un employé qui se caractérise par sa date d’entrée à la société.
Tous les ouvriers ont une valeur commune appelée SMIG=2500 DH
L’ouvrier a un salaire mensuel qui est : Salaire = SMIG + (Ancienneté en année)*100.
De plus, le salaire ne doit pas dépasser SMIG*2.
Un cadre est un employé qui se caractérise par un indice.
Le cadre a un salaire qui dépend de son indice :
1 : salaire mensuel 13000 DH
2 : salaire mensuel 15000 DH
3 : salaire mensuel 17000 DH
4 : salaire mensuel 20000 DH
Un patron est un employé qui se caractérise par un chiffre d’affaire et un pourcentage.
Le chiffre d’affaire est commun entre les patrons.
Le patron a un salaire annuel qui est égal à x% du chiffre d'affaire : Salaire = CA*pourcentage/100
1) Créer la classe abstraite Employé.
2) Créer la classe Ouvrier, la classe Cadre et la classe Patron qui héritent de la classe Employé, et prévoir les Constructeurs
et la méthode str() de chacune des 3 classes.
3) Implémenter la méthode GetSalaire() qui permet de calculer le salaire pour chacune des classes.
CHAPITRE 3
CARACTÉRISER
L’ABSTRACTION 1- Classes et méthodes abstraites
2- Interface
Utilité des classes abstraites
• les classes abstraites permettent de définir des fonctionnalités(des comportements)
que les sous-classes devront impérativement implémenter
• Les utilisateurs des sous-classes d'une classe abstraite sont donc assurés de trouver
toutes les méthodes définies dans la classe abstraite dans chacune des sous-classes
concrètes
• Une interface est une forme particulière de classe où toutes les méthodes sont
abstraites
• Lorsqu'une classe implémente une interface, elle indique ainsi qu'elle s'engage à
fournir une implémentation (c'est-à-dire un corps) pour chacune des méthodes
abstraites de cette interface.
• Si une classe implémente plus d'une interface, elle doit implémenter toutes les
méthodes abstraites de chacune des interfaces.
Principe d’interface
Exemple1: Si l'on souhaite caractériser la fonctionnalité de comparaison qui est commune à
tous les objets qui ont une relation d'ordre (plus petit, égal, plus grand), on peut définir
l'interface Comparable.
1
8
5
Principe d’interface
interface
imprimable
Exemple2: Imprimer()
class Outils(Comparable):
def __init__(self, long, prix):
self.__longueur=long
self.__prix=prix
def CompareTo(self,o):
if self.__longueur==o.__longueur:
return True
else:
return False
#objets
p1=Personne("Ali",5)
p2=Personne("fati",20)
o1=Outils(60,450)
o2=Outils(60,450)
if (p1.CompareTo(p2)):
print("ont le meme age")
else:
print("ces personnes ont des ages différents")
if (o1.CompareTo(o2)):
print("ces objets sont egaux, ils ont meme longueur")
else:
print("longueurs différents")
TP: Les interfaces
On considère les informations suivantes : Un véhicule est identifié par :
• Numéro d’immatriculation
• date de mise en marche
• marque
• modèle
Un élève est identifié par ce qui suit :
• Numéro
• Son Nom
• Sa date de naissance
• Son niveau
• Sa branche
• véhicule
Un enseignant du centre est identifié par ce qui suit :
• Un matricule
• Son Nom
• Date de naissance
• Date d’embauche
• Salaire
• véhicule
Un parrain est enseignant qui encadre un ensemble des élèves avec une prime d’encadrement 70DH par élève
1. Créer les classes véhicule, élève, enseignant et Parrain (attributs, accesseurs, constructeurs, str())
2. Réaliser l’interface IAnnée qui comporte la méthode :
Int CalculerAnnee(DateTime dateEntre) : cette méthode prend en paramètre la date de début à partir de laquelle le nombre d’année sera calculé
3. Réaliser l’interface ICalcul qui comporte la méthode :
Double CalculSalaireTotal() : cette méthode donnera en retour le salaire total
4. Implémenter ces méthodes dans les classes correspondantes.
5. Définir pour les classes la méthode CompareTo de l'interface IComparable
6. Tester tous les classes