Vous êtes sur la page 1sur 54

30/05/2022

POO Python
Partie 1
Classes, Objets, Héritage,
Polymorphisme et collections

Pr Bendahmane

RÉSUMÉ THÉORIQUE – FILIÈRE DÉVELOPPEMENT DIGITAL


M103 - Programmer en Orienté Objet

100 heures

1
30/05/2022

01 - APPRÉHENDER LE PARADIGME DE
LA POO Introduire la POO
Définir une classe
SOMMAIRE Créer un objet
Connaître l’encapsulation
Manipuler les méthodes
02 - CONNAÎTRE LES PRINCIPAUX
PILIERS DE LA POO
Définir l’héritage
Définir le polymorphisme
Caractériser l’abstraction
Manipuler les interfaces
03 - CODER DES SOLUTIONS ORIENTÉES OBJET
Coder une solution orientée objet
Manipuler les données
Utiliser les expressions régulières
Administrer les exceptions
04 - MANIPULER LES MODULES
ET LES BIBLIOTHÈQUES
Manipuler les modules
Manipuler les bibliothèques

1 Introduction à la POO

Pr Bendahmane

2
30/05/2022

Notion de classe

1. Définition d’une classe


2. Modélisation d’une classe
3. Composantes d’une classe

01 - Coder une solution orientée objet


Création d’un package

• Un répertoire contenant des fichiers et/ou répertoires = package


• Pour créer votre propre package, commencez par créer dans le
même dossier que votre programme principal (exemple main.py),
un dossier portant le nom de votre package (exemple src).
• Le package src contient des fichiers sources classés dans des
sous-packages
• Avant Python 3.3, un package contenant des modules Python
doit contenir un fichier init .py

package src
PARTIE 3

Copyright - Tout droit réservé -


OFPPT 6

3
30/05/2022

01 - Coder une solution orientée objet


Création d’un package

• Pour importer et utiliser les classes (classe1 et classe2) définies dans ExempleClass.py, il faut ajouter dans main.py la ligne suivante :

from src.ExempleClass import class1,class2

• Si ExempleClass.py est dans subpackage qui est défini dans src il faut ajouter dans main.py la ligne suivante :

from src.subpackage.ExempleClass import class1,class2


PARTIE 3

Copyright - Tout droit réservé -


OFPPT 7

02 - Définir une classe


Définition d’une classe

Notion de classe
• Une classe peut être assimilée à la notion de type que
l’on voit dans les langages de programmation
procédurales.

• Une classe est considéré comme un modèle à partir


duquel vont être créés un ensemble d'objets. Ces objets
ont des données ou des propriétés communes et les
mêmes comportements.
PARTIE 1

Objet : maison 1

Copyright - Tout droit réservé - 21


OFPPT

4
30/05/2022

02 - Définir une classe


Modélisation d’une classe

Modélisation d’une classe


• Une classe est caractérisée par :
• Un nom
• Une composante statique : des champs (ou
attributs). Ils caractérisent l’état des objets
pendant l’exécution du programme Nom de la classe

• Une composante dynamique : des méthodes Véhicule


représentant le comportement des objets de cette Marque : chaine
classe. Elles manipulent les champs des objets et Composante statique Puissance : entier
caractérisent les actions pouvant être effectuées Vitesse-max: entier
par les objets
Démarrer()
Accélérer()
Composante dynamique Avancer()
Reculer()
PARTIE 1

Exemple: classe Véhicule

23

02 - Définir une classe


Composantes d’une classe

Personne Nom de la classe

Nom
Prénom Attributs de la classe
Age (variable)

Méthodes de la classe
decrisToi()
(fonction)
Mange();
Marche(); Une classe regroupe une famille d’objets dont les caractéristiques sont les mêmes.

Caractéristiques des objets :

même structure : mêmes attributs


PARTIE 1

valeurs des attributs différentes


même manière de répondre à un

Instanciation = création d’un objet à partir d’une classe


10

5
30/05/2022

02 - Définir une classe


Composantes d’une classe

Tahiri • obj1
•Exemple: la classe Personne
Amine
20
Instanciation

Personne
Nom
Prénom Instanciation Benani
Age Ahmed • Obj2
decrisToi() 37
Mange();
Marche();
Instanciation

Alaoui

Constructeur
yahya • Obj3
70

Création d’une classe


 Classe vide

 Classe Personne avec deux attributs nom et age

6
30/05/2022

Méthodes

Méthodes
• Les méthodes représentent des fonctions assignées directement à une classe. Elles accèdent automatiquement aux attributs de la même
classe.
• Les méthodes sont des fonctions qui contiennent le paramètre explicite (self) qui représente l’instance de la classe courante. Ce paramètre
permet l’utilisation des données de cette classe.

Déclaration d’une méthode Appel d’une méthode


class nom_classe : cl = nom_classe() # variable de type nom_classe
def nom_methode(self, param_1, ..., param_n): t = cl.nom_methode (valeur_1, ..., valeur_n)
# corps de la méthode...
PARTIE 3

Self désigne l’instance courante de la classe

Copyright - Tout droit réservé - 1


OFPPT
3

Attributs

Attributs
• Les attributs sont des variables assignées de manière directe à une classe.
• Les attributs de la classe sont des variables globales qui peuvent être utilisées dans toutes les méthodes de cette classe.
Déclaration d’un attribut

class nom_classe :
def nom_methode (self, param_1, ..., param_n) :
self.nom_attribut = param_1

Déclaration d’un attribut en précédant son


nom par self
PARTIE 3

Copyright - Tout droit réservé - 1


OFPPT
4

7
30/05/2022

Exemple

16

2
Notions de constructeur
et destructeur

Pr Bendahmane

8
30/05/2022

Notion de constructeur

Types de Constructeurs
Constructeur • Constructeur par défaut
• Un constructeur est une méthode • Un constructeur sans aucun paramètre est appelé un
particulière invoquée implicitement lors de constructeur par défaut
la création d'un objet
• Un constructeur permet d'initialiser les • Si nous ne créons pas de constructeur, la classe appellera
données des objets (les attributs) de la automatiquement le constructeur par défaut lorsqu’un
classe dont elle dépend objet est créé
• Le constructeur ne doit pas avoir un type de • Constructeur paramétré:
retour • Un constructeur avec au moins un paramètre s’appelle
un constructeur paramétré
• Une classe peut posséder plusieurs
constructeurs, mais un objet donné n'aura
pu être produit que par un seul constructeur

En python le constructeur est nommé : __init__

Exemple

9
30/05/2022

Exemple 2
if __name__=='__main__':
#Créez un objet de Personne.
class Personne : p= Personne("grace", 21, "Femelle")
# Les paramètres d'âge et de sexe ont une p. afficherInfo() Affiche: Aimee 21
valeur par défaut. Femelle
print (" --------------- ")
def __init__ (self, nom, age = 1, sexe = "Male" ):
#age, sexe par défaut.
self.nom = nom
p2 = Personne( "Alice" ) Affiche: Alice 1 Male
self.age = age
p2. afficherInfo()
self.sexe= sexe
print (" --------------- ")
def afficherInfo(self):
#sexe par défaut.
print ("Name: ", self.nom)
p3 = Personne("Leo", 37) Affiche: Tran 37 Male
print ("Age: ", self.age)
p2. afficherInfo()
print ( "sexe: ", self.sexe)

Isinstance()
 Instanciation d’une classe
La fonction isinstance() permet de s'assurer qu'une instance a été créé à partir d'une classe donnée (ceci est très utile dans le cas de l’héritage).

class Personne :
# Les paramètres d'âge et de sexe ont une valeur par
défaut.
def __init__ (self, nom, age = 1, sexe = "Male" ):
self. nom = nom
self.age = age
self.sexe= sexe
if __name__=='__main__': Affiche: True car Alice est de type personne

p1=Personne("Alice",21,"Female")
print(isinstance(p1,Personne))

C’est l’environnement d’execution principal

10
30/05/2022

Destructeur
Les destructeurs sont appelés lorsqu'un objet est détruit.
En Python, les destructeurs ne sont pas nécessaires car ce langage de programmation dispose
d'un ramasse-miettes assurant le gestion automatiquement de la mémoire.
La méthode __del __ () est une méthode appelée destructeur en Python.
Le destructeur est appelé lorsque toutes les références à l’objet ont été supprimées, c’est-à-dire lorsqu’un
objet est nettoyé.
class Personne :
Syntaxe de destructeur # Les paramètres d'âge et de sexe ont une valeur
par défaut.
def __del__(self):
def __init__ (self, nom, age = 1, sexe = "Male" ):
# actions
self. nom = nom
Appel de destructeur self.age = age
self.sexe= sexe
del instanceObjet
def __del__(self):
print("je suis le destructeur")

if __name__=='__main__':
p=Personne(" Alice",21,"Female") Affiche: je suis le destructeur
del p

Exemple de destructeur

Destructeur
Exemple :

class Personne : if __name__=='__main__’: #définition du programme


def __init__ (self, nom, age = "1", sexe = "Male" ): principal
self. nom = nom
p=Personne("Alice","21"," Femelle") Affiche: Alice 21 Femelle
self.age = age
p. afficheInfo() #appel de la fonction showInfo()
self.sexe= sexe Affiche: je suis le destructeur
del p #appel du destructeur
def afficheInfo(self):
print (p) #affiche une erreur car l’objet a été détruit
print(self.nom+" " + self.age+" " + self.sexe)
def __del__(self): #definition d’un destructeur
print("je suis le destructeur") Affiche: Traceback (most
recent call last):File
"C:/Users/DELL/Desktop/poo/ex
PARTIE

emple.py", line 19, in <module>


print(aimee) NameError: name
3

'aimee' is not defined

Copyright - Tout droit réservé - OFPPT 22

11
30/05/2022

L’attribut spécial __doc__

• Dans un code destiné a être réutilisé, il faut absolument définir dans le documentation ce que fait la classe
et ses entrées et sorties
• L’attribut spécial __doc__affiche la documentation de la classe

class Vehicule():
"""
Classe Véhicule avec option couleur
"""
def __init__(self):
self.couleur="rouge"
def get_couleur(self):
print ("Recuperation de la couleur")
PARTIE

if __name__=='__main__': Affiche: Récupération de la couleur


ma_voiture= Vehicule()
3

print(ma_voiture.__doc__) Affiche: Classe voiture avec option couleur

Copyright - Tout droit réservé - OFPPT 23

L’attribut spécial __dict__ et la fonction dir

L’attribut spécial __dict__


• Cet attribut spécial donne les valeurs des attributs de l'instance :

if __name__=='__main__':
ma_voiture= Vehicule() Affiche: {'couleur': 'rouge'}
print( ma_voiture.__dict__)

Fonction dir
• La fonction dir donne un aperçu des méthodes de l'objet :

if __name__=='__main__':
ma_voiture= Vehicule()
Affichage des méthodes de la classe voiture
print(dir(ma_voiture))
PARTIE
3

Copyright - Tout droit réservé - OFPPT 24

12
30/05/2022

Méthode __str__ pour l’affichage d’un objet

Affichage d’un objet


• __str__ : vous donne la possibilité de redéfinir l’affichage d’un objet

class Vehicule():
"""
Classe Vehicule avec option couleur
"""
def __init__(self):
self.couleur="rouge"
def get_couleur(self):
print ("Récupération de la couleur")
def __str__(self): #définition de la fonction __str__
return ("la couleur de la véhicule est : "+ self.couleur)
PARTIE

if __name__=='__main__':
ma_voiture= Vehicule()
3

print( ma_voiture) #appel de __str__ Affiche: la couleur de la Véhicule est rouge

Copyright - Tout droit réservé - OFPPT 25

Ajouter un attribut uniquement pour un objet

Apport du langage Python


Ajout d'un attribut d'instance
• Il est possible d'ajouter un attribut uniquement pour une instance donnée via la syntaxe suivante :

instance.nouvel_attribut = valeur

if __name__=='__main__':
v1=Voiture()
print("attribut de ma voiture")
print(v1.__dict__) Affiche:{ 'couleur': 'rouge'}
v2=Voiture()
v2.matricule=12345 #ajout d’un nouveau attribut pour
l’instance sa_voiture
PARTIE

print("attribut de sa voiture") Affiche:{'couleur': 'rouge', 'matricule': 12345}


print(v2.__dict__)
3

Copyright - Tout droit réservé - OFPPT 26

13
30/05/2022

Exemple

14
30/05/2022

Exercice 1

 Ecrire une classe « rectangle» qui contient la largeur et la


longueur .
 Créer un constructeur paramétrique;
 Ecrire les méthodes description() , perimetre() , surface()
et iscarree() ;
 Créer un destructeur affichant un message (je suis le
destructeur)
 créer 3 objets de type réctangle
 Appeler les méthodes déjà citées
 Supprimer les 3 objets

Exercice 2

 Ecrire une classe « LIVRE» qui contient le titre, auteur, prixHT, remise
 Créer un constructeur paramétrique;
 Ecrire les méthodes, calcPTTC() , calcPRemise();
 Redéfinir la méthode __str__ pour afficher toutes les informations d’un
livre
 créer 3 objets de type livres
 Appeler les méthodes déjà citées
 Appeler l’attribut __dict__
 Tester les attributs spéciaux

15
30/05/2022

33

3
Attributs et méthodes de
classe

Pr Bendahmane

Attribut de classe

Attribut de classe
• Les attributs de classe sont différents des attributs d’instance.
• Un attribut dont la valeur est la même pour toutes les instances d’une classe est appelé un attribut de classe. Par conséquent, la valeur
de l’attribut de classe est partagée par tous les objets.
• Les attributs de classe sont définis au niveau de la classe plutôt qu’à l’intérieur de la méthode __init__().
• Contrairement aux attributs d’instance, les attributs de classe sont accessibles à l’aide du nom de la classe ou le nom d’instance.
PARTIE
3

Copyright - Tout droit réservé - OFPPT 34

16
30/05/2022

Méthodes statiques

Méthodes statiques
• Une méthode statique est une méthode dont l’exécution ne dépend pas d’une instance de la classe
• Elle est utilisée pour définir des fonctions utiles à toute la classe
• Les méthodes statiques peuvent être appelées sans création d’instance au préalable.
• Une méthode statique peut être appelée sans instance. De ce fait, le paramètre Self est inutile.
• La déclaration d’une méthode statique se fait avec le décorateur @staticmethod
Exemple :

class nom_class : Nom_méthode est une méthode statique


@staticmethod
def nom_methode(params, ...) :
class essai_class:
# corps de la méthode
@staticmethod
def methode(): #déclaration d’une méthode statique
print("méthode statique")
PARTIE

La méthode statique methode ne nécessite


if __name__=='__main__':
aucune création d’instance pour être
appelée essai_class.methode()
3

Affiche: méthode statique

Copyright - Tout droit réservé - OFPPT 35

01 - Coder une solution orientée objet


Codage d’une classe

Ajout de méthodes
• Il est possible de déclarer une fonction statique à l’extérieur de la classe dans laquelle nous travaillons. Cette même fonction peut être
appelée comme étant une méthode statique dans notre classe.
• Dans l’exemple ci-dessous, nous déclarons une fonction methode. A l’aide de staticmethod nous indiquons à la classe essai_class que
c’est une méthode statique.
Exemple :
def methode():
print("méthode statique)

class essai_class:
pass

if __name__=='__main__':
essai_class.methode = staticmethod(methode) #ajout d’une méthode statique
essai_class.methode()
PARTIE

Affiche: méthode statique


3

Copyright - Tout droit réservé - OFPPT 36

17
30/05/2022

Exercice

 Ajouter à la classe livre un compteur permettant de calculer le nombre de


livres crées.
 Ajouter une méthode statique permettant d’afficher la valeur du compteur

18
30/05/2022

40

4 Modificateurs d’accès

Pr Bendahmane

Modificateur d’accès public

Modificateur d’accès public


• Les membres d’une classe déclarés publics sont facilement accessibles depuis n’importe quelle partie du programme.
• Tous les attributs et les méthodes d’une classe sont publiques par défaut.

if __name__=='__main__':
class EtudiantGeek:
obj = EtudiantGeek("R2J", 20)
def __init__(self, nom, age):
print(" Nom: ", obj.Nom)
self.Nom = nom Nom et Age sont des
attributs publiques obj. afficheAge()
self.Age = age

Affiche:
def afficheAge(self): Méthode publique Name: R2J
print("Age: ", self.Age) Age: 20
PARTIE
3

Copyright - Tout droit réservé - OFPPT 41

19
30/05/2022

01 - Coder une solution orientée objet


Codage d’une classe

Modificateur d’accès privé


• Les membres d’une classe qui sont déclarés privés sont accessibles uniquement dans la classe
• Le modificateur d’accès privé est le modificateur d’accès le plus sécurisé.
• Les données membres d’une classe sont déclarées privées en ajoutant un double trait de soulignement «__» avant le membre de
données de cette classe.
PARTIE
3

Copyright - Tout droit réservé - OFPPT 42

Modificateur d’accès privé

Modificateur d’accès privé


Exemple :
PARTIE
3

Erreur

Copyright - Tout droit réservé - OFPPT 43

20
30/05/2022

GETTER et SETTER

Getter et Setter en Python


• Les Getters et Setters en Python sont souvent utilisés pour éviter l’accès direct à un champ de classe, c’est-à-dire que les variables privées ne
peuvent pas être accessibles directement ou modifiées par un utilisateur externe.
Utilisation de la fonction normale pour obtenir le comportement des Getters et des Setters

getter

Setter
PARTIE 3

Copyright - Tout droit réservé - 4


OFPPT
4

Getter et Setter avec property()

Getter et Setter avec property()


• En Python property() est une fonction intégrée qui crée et renvoie un objet de propriété.
• Un objet de propriété a trois méthodes, getter(), setter() et delete().
• La fonction property() en Python a trois arguments property (fget, fset, fdel,doc)
• fget est une fonction pour récupérer une valeur d’attribut
• fset est une fonction pour définir une valeur d’attribut
• fdel est une fonction pour supprimer une valeur d’attribut
• doc est une chaîne contenant la documentation (docstring à voir ultérieurement) de l’attribut
PARTIE 3

Copyright - Tout droit réservé - 4


OFPPT
5

21
30/05/2022

Exemple (1) des


propriétés

getter

Setter

La propriété rassemblant le getter


et setter

Utilisation du getter de la propriété

Utilisation du setter de la propriété

Exemple (2) des


propriétés

getter

Setter

La propriété rassemblant le getter


et setter

Utilisation du getter de la propriété

Utilisation du setter de la propriété


Deleter

22
30/05/2022

Décorateur @property

Utilisation de @property
• @property est un décorateur qui évite d'utiliser la fonction getter explicite
• @attribut.setter est un décorateur qui évite d'utiliser la fonction setter explicite
Exemple :

getter

Setter

Deleter
PARTIE 3

Utilisation du getter

Utilisation du setter

Deleter

Copyright - Tout droit réservé - 4


OFPPT
8

23
30/05/2022

Exercice

 Modifier l’accessibilité des attributs de la classe Livre en respectant les


consignes suivantes :
 Le titre privé avec une gestion par les getter et setter
 L’auteur privé avec une gestion par les properties
 PrixHT privé avec une gestion par les décorateurs

Exercice
 Ecrire une classe « étudiant» qui contient le nom, prénom, date
naissance, et un tableau de notes
 Créer un constructeur parametré qui initialise l’ensemble des
attributs
 Créer la méthode CalculerMoyenne() qui calcule la moyenne des
notes d’unétudiant
 Créer la méthode CalculerAge() qui calcule l’age d’un étudiant
 Créer la méthode Saisir() qui demande à l’utilisateur de saisir toutes
les informations d’un étudiant (y compris le nombre de notes )
 Créer la méthode Afficher() qui affiche toutes les informations de
l’étudiant y compris sa moyenne générale
 créer un étudiant et appeler les méthodes déjà citées

24
30/05/2022

55

5 Héritage et polymorphisme

Pr Bendahmane

01 - Définir l’héritage
Principe de l’héritage

Principe de l’héritage
• L'héritage est une notion qui définit une relation de spécialisation ou de généralisation entre différentes classes (Exp :
une relation d'héritage entre les classes Employé et Directeur, et la classe Salarié).

• Lorsqu'une classe A hérite d'une classe B :


• A s'octroie toutes les propriétés de B, en plus de ses propres propriétés.
• A est alors considéré comme une spécialisation de B.
• Dans le même temps, B peut être vu comme une généralisation de A.
• A est appelée classe fille de B, ou classe dérivée de B.
• B est dite classe mère ou super-classe de A.

• Toute instance (objet) de A peut être considéré comme un objet de B.


PARTIE 2

• Une instance de B ne peut être toujours considéré comme un objet de A.

56

25
30/05/2022

01 - Définir l’héritage
Principe de l’héritage

Principe de l’héritage
Exemple :
• Considérons la définition des 3 classes Personne, Etudiant et Employé suivantes :

Etudiant Employé

Nom: chaine Nom: chaine


CIN: entier CIN: entier
anneeNaiss: entier anneeNaiss entier
note : réel prixHeure: réel
age() nbreHeure: réel
moyenne()
age()
Problème : Salaire()
PARTIE 2

• Duplication du code.
• Toute modification d'un attribut ou d'une méthode doit être répétée dans chaque classe
où ils ont été déclarés. (Exp : si on souhaite modifier le type de l'attribut anneeNaiss, il
faut le faire dans chacune des 3 classes).

57

01 - Définir l’héritage
Principe de l’héritage

Solution :
• Placer dans la classe mère les propriétés en commun à toutes Personne
les autres classes.
Nom: chaine
• On ne garde dans les classes filles que les attributs ou CIN: entier Super-classe
méthodes qui leur sont spécifiques. anneeNaiss: entier
• Les classes dérivées héritent automatiquement des attributs
age()
(et des méthodes) qui n'ont pas besoin d'être réécrits.

Héritent de

Etudiant Employé
prixHeure: réel
PARTIE 2

note1: réel nbreHeure: réel


moyenne() Salaire()

Sous-classes

58

26
30/05/2022

Héritage simple

Héritage unique
• Rappel : L’héritage unique permet à une classe dérivée d’hériter des propriétés d’une seule classe parente, permettant ainsi la
réutilisation du code et l’ajout de nouvelles fonctionnalités au code existant.
Syntaxe : Class Nom_classe(Nom_SuperClass)

Exemple :
PARTIE 3

5
9

Héritage Multiple

Héritage multiple
Personne
• Une classe peut hériter de plusieurs classes
Nom: chaine
ÊtreVivant CIN entier
Exemple :
dateNaiss: entier
• Un Etudiant est à la fois une Personne et un EtreVivant Taille: entier
• La classe Etudiant hérite des attributs et des méthodes age()
des respirer()
• deux classes

 Il deviennent ses propres attributs et méthodes

Etudiant
PARTIE 2

Note1, note2 réel

Moyenne()

61

27
30/05/2022

Héritage Multiple

Héritage multiple
• Rappel : Lorsqu’une classe peut être dérivée de plusieurs classes de base, ce type d’héritage est appelé héritage multiple. Dans l’héritage
multiple, toutes les fonctionnalités des classes de base sont héritées dans la classe dérivée.
Exemple :
class Mere: if name ==' main ':
nomMere = "" s1 = Enfant()
def mere(self): s1. nomPere = "RAM"
print(self. nomMere) s1. nomMere = "SITA"
s1.parents()
class Pere: #Affiche:
nomPere = "" #Father : RAM
def pere(self): #Mother : SITA
print(self. nomPere)
PARTIE 3

class Enfant(Mere, Pere): #hérite de la classe Mere et Pere


def parents(self):
print("Father :", self. nomPere) # nomPere est attribut hérité
print("Mother :", self. nomMere) # nomMere est attribut hérité

6
2

Héritage en cascade

Héritage en cascade
Personne
• Une classe sous-classe peut être elle-même une super-classe.
Nom: chaine
CIN entier
Exemple : dateNaiss: entier
• Etudiant hérite de Personne
• EtudiantDeuxièmeCycle hérite de Etudiant age()
 EtudiantDeuxièmeCycle hérite de Personne

Etudiant

Note1, note2 réel

Moyenne()
PARTIE 2

Etudiant
DeuxiemeCycle

Option: chaine

63

28
30/05/2022

Héritage en cascade

Héritage en cascade
• Dans l’héritage en cascade, les fonctionnalités de la classe de base et de la classe dérivée sont ensuite héritées dans la nouvelle classe dérivée

class GrandPere: if name ==' main ':


def init (self, nomGrandPere): s1 = Enfant('Prince', 'Rampal', 'Lal mani')
self. nomGrandPere = nomGrandPere print(s1. nomGrandPere)
class Pere(GrandPere): s1.affiche_name()
def init (self, nomPere, nomGrandPere): #affiche:
self. nomPere = nomPere #Lal mani
GrandPere. init (self, nomGrandPere) # nom grand_père : Lal mani
class Enfant(Pere): # nom_père: Rampal
def init (self,nomEnfant, nomPere, nomGrandPere): # nom enfant: Prince
self. nomEnfant = nomEnfant
PARTIE 3

Pere. init (self, nomPere, nomGrandPere)


def affiche_name(self):
print(‘nom grand_père :', self. nomGrandPere)
print(“nom_père:", self. nomPere)
print(“nom enfant:", self. nomEnfant)
6
4

Chainage de constructeurs

Chainage de constructeurs
•Le chaînage de constructeurs est une technique d’appel d’un constructeur de la classe mère à partir d’un constructeur de la classe fille
Exemple :

class GrandPere:
def init (self, nomGrandPere):
self. nomGrandPere = nomGrandPere
class Pere(GrandPere):
def init (self, nomPere, nomGrandPere):
self. nomPere = nomPere

GrandPere. init (self, nomGrandPere)


PARTIE 3

Appel du constructeur de la classe mère pour initialiser l’attribut hérité


nomGrandPere

6
5

29
30/05/2022

Chainage de constructeurs

Chainage de constructeurs

class Enfant(Pere):
def init (self,nomEnfant, nomPere, nomGrandPere):
self. nomEnfant = nomEnfant
Pere. init (self, nomPere, nomGrandPere) Appel du constructeur de la classe mère pour initialiser les
attributs hérités nomPere et nomGrandPere

def affiche_name(self):
print(‘nom grand_père :', self. nomGrandPere)
if name ==' main ':
print(“nom_père:", self. nomPere) s1 = Enfant('Prince', 'Rampal', 'Lal mani')
print(“nom enfant:", self. nomEnfant) print(s1. nomGrandPere)
s1.affiche_name()
#affiche:
PARTIE 3

#Lal mani
# nom grand_père : Lal mani
# nom_père: Rampal

# nom enfant: Prince

6
6

Polymorphisme (Redéfinition des


méthodes)

Polymorphisme et héritage
• En Python, le polymorphisme permet de définir des méthodes dans la classe enfant qui ont le même nom que les méthodes de la
classe parent.
• En héritage, la classe enfant hérite des méthodes de la classe parent.
• Il est possible de modifier une méthode dans une classe enfant dont elle a hérité de la classe parent (redéfinition de la méthode).
Exemple :
PARTIE 3

Redéfinition de la méthode Afficher

6
7

30
30/05/2022

Exercice

Employé

Matricule
Nom
Salaire

Afficher() Commercial
SalAnnuel()
ChiffreAffaire
Commisison
Afficher()
SalAnnuel()

69

31
30/05/2022

73

6 Surcharge des opérateurs

Pr Bendahmane

Surcharge des opérateurs

Surcharge des opérateurs en Python


• La surcharge d’opérateurs vous permet de redéfinir la signification d’opérateur en fonction de votre classe.
• Cette fonctionnalité en Python, qui permet à un même opérateur d’avoir une signification différente en fonction du contexte.
Opérateurs arithmétiques

Affiche:
Traceback (most recent call last):
File "prog.py", line 10, in < module>
p3 = p1+p2
TypeError: unsupported operand type(s) for +: 'Point' and 'Point'

Erreur!!!
Python ne savait pas comment ajouter deux objets Point
Erreur!!! ensemble.
PARTIE 3

7
4

32
30/05/2022

01 - Coder une solution orientée objet


Intégration des concepts POO

Surcharge des opérateurs en Python


• Pour surcharger l'opérateur +, nous devrons implémenter la fonction add () dans la classe

Exemple :
PARTIE 3

7
5

Fonctions spéciales de surcharge de


l'opérateur en Python

Fonctions spéciales de surcharge de l'opérateur en Python


Opérateur Expression Interprétation Python

Addition P1+p2 p1. add (p2)

Soustraction p1-p2 p1. sub (p2)

Multiplication pP1*p2 p1. mul (p2)

Puissance p1**p2 p1. pow (p2)

Division p1/p2 p1. truediv (p2)

Division entière p1//p2 p1. floordiv (p2)


Le reste(modulo) p1%p2 p1. mod (p2)

ET binaire p1&p2 p1. and (p2)


PARTIE 3

OU binaire p1|p2 p1. or (p2)

XOR p1^p2 p1. xor (p2)

NON binaire ~p1 p1. invert (p2)

7
6

33
30/05/2022

Opérateurs de comparaison

Surcharge des opérateurs en Python


Opérateurs de comparaison
• En Python, il est possible de surcharger les opérateurs de comparaison.

import math
class Point:
def init (self, x, y): if name ==' main ':
self.x = x p1 = Point(2, 4)
self.y = y p2 = Point(5, 1)
if p1 < p2:
def lt (self, p): print("p2 est plus loin que p1")
m_self = math.sqrt((self.x ** 2) + (self.y ** 2))
m2_p = math.sqrt((p.x ** 2) + (p.y ** 2)) #affiche:
PARTIE 3

return m_self < m2_p #p2 est plus loin que p1

Surcharge de l’opérateur inférieur

7
7

Fonctions spéciales de surcharge de


l'opérateur en Python

Fonctions spéciales de surcharge de l'opérateur en Python

Opérateur Expression Interprétation Python

Inférieur à p1<p2 p1. lt (p2)

Inférieur ou égal p1<=p2 p1. le (p2)

Egal p1==p2 p1. eq (p2)

Différent p1!=p2 p1. ne (p2)

Supérieur à p1>p2 p1. gt (p2)

Supérieur ou égal p1>=p2 p1. ge (p2)


PARTIE 3

7
8

34
30/05/2022

Exercice

 Redéfinir dans la classe livre les opérateurs suivants :


 + : pour additionner les prix HT des livres
 - : pour soustraire les prix HT des livres
 % : pour retourner le reste de la division entre le prixHT et une valeur a
 > : pour retourner le livre ayant le prix HT le plus élevé
 == : pour voir si les prix HT sont égaux

35
30/05/2022

83

7 Classe Abstraite

Pr Bendahmane

01 - Coder une solution orientée objet


Intégration des concepts POO

Classe abstraite

• Rappel: Les classes abstraites sont des classes qui ne peuvent pas être instanciées, elles contiennent une ou plusieurs
méthodes abstraites (méthodes sans code)

• Une classe abstraite nécessite des sous-classes qui fournissent des implémentations pour les méthodes abstraites sinon
ces sous-classes sont déclarées abstraites

• Une classe abstraite hérite de la classe abstraite de base – ABC

• L’objectif principal de la classe de base abstraite est de fournir un moyen standardisé de tester si un objet adhère à
une spécification donnée

• Pour définir une méthode abstraite dans la classe abstraite, on utilise un décorateur @abstractmethod
PARTIE 3

Copyright - Tout droit réservé - 8


OFPPT
4

36
30/05/2022

Exemple : sans classe abstraite


PARTIE 3

Exemple : Avec classe abstraite


PARTIE 3

37
30/05/2022

Exemple : Avec classe abstraite


PARTIE 3

38
30/05/2022

89 Exercice
 Créer une classe abstraite Figure contenant la couleur comme Attribut
 Ajouter les Méthodes abstraites périmètre et surface.
 Ajouter la Méthode Afficher qui affiche les informations d’une figure.

Créer Les classes suivantes héritant de la classe abstraite:


 rectangle;
 triangle ;
 carré.
Implémenter les méthodes abstraites .

30/05/2022

91

8 Les Collections

Pr Bendahmane

39
30/05/2022

Exercice

 Soit la classe Livre crée auparavant. Ajouter à cette classe les méthodes
saisir() et __str__.
 Proposer à l’utilisateur un menu pour :
 Ajouter des livres dans une liste
 Afficher les livres
 Supprimer un livre à partir de son titre
 Modifier un livre
 Rechercher les livres par auteur
 Calculer la moyenne des Prix TTC après remise

Les collections

• Le module collections contient des conteneurs de données spécialisés


• La liste des conteneurs est la suivante

Conteneur Utilité

namedtuple Une fonction permettant de créer une sous-classe de tuple avec des champs nommés

desque Un conteneur ressemblant à une liste mais avec ajout et suppression rapide à chacun des bouts

ChainMap Permet de linker entre eux plusieurs mappings ensemble pour les gérer comme tout

Counter Permet de compter les occurrences d’objet hachable

OrderedDict Une sous classe de dictionnaire permettant de savoir l’ordre des entrées
PARTIE 3

defaultdict Une sous classe de dictionnaire permettant de spécifier une valeur par défaut dans le constructeur

40
30/05/2022

97

Les Collections :
Nametuple

Pr Bendahmane

Namedtuple : Crée une classe


dont les champs sont nommés
Collections - namedtuple
• un tuple est une collection immuable de données souvent hétérogène.

t=(11,22)
print(t) #affiche (11, 22)
print(t[0]) #affiche 11
print(t[1]) #affiche22

• La classe namedtuple du module collections permet d'ajouter des noms explicites à chaque élément d'un tuple
pour rendre ces significations claires dans un programme Python

from collections import namedtuple #importation de la classe namedtuple du module collections


Point = namedtuple('Point', ['x', 'y'])
p = Point(11, y=22) # instanciation par position ou en utilisant le nom du champs
print(p[0] + p[1]) # les champs sont accessibles par leurs indexes affiche :33
PARTIE 3

print(p.x + p.y) # les champs sont accessibles par nom affiche 33


print(p) # lisible dans un style nom=valeur affiche Point(x=11,y=22)

9
8

41
30/05/2022

02 - Manipuler les données


Collections

Collections - namedtuple
• La méthode _asdict() permet de convertir une instance en un
dictionnaire.
• Appeler p._asdict() renvoie un dictionnaire mettant en correspondance les
noms de chacun des deux champs de p avec leurs valeurs correspondantes.

from collections import namedtuple


Point = namedtuple ('Point',['x','y'])
p=Point(11,y=22)

print(p._asdict()) # renvoie un dictionnaire, affiche {'x': 11, 'y': 22}

• La fonction _replace(key=args) permet de retourner une


nouvelle instance de notre tuple avec une valeur modifiée.
from collections import namedtuple
PARTIE 3

Point = namedtuple ('Point',['x','y'])


p=Point(11,y=22)

print(p._replace(x=4)) #changer la valeur de x x=4, affiche: Point(x=4, y=22)

9
9

namedtuple

Collections - namedtuple
• La fonction _mytuple._fields permet de récupérer les noms
des champs de notre tuple. Elle est utile si on veut créer un
nouveau tuple avec les champs d’un tuple existant.

from collections import namedtuple


Point = namedtuple ('Point',['x','y'])
print(Point._fields) #retourne les noms de champs affiche: (‘x’,’y’)
Color =namedtuple ('Color', 'red green, blue')
Pixel= namedtuple ('Pixel', Point._fields + Color._fields) #on crée un nouveau tuple avec les champs de point et de color
print(Pixel(11,22,128,266,0)) #affiche: Pixel(x=11, y=22, red=128, green=266, blue=0)
PARTIE 3

1
0

42
30/05/2022

exemple

43
30/05/2022

Exercice

 Créer un namedtuple pour la classe Livre


 Stocker dans ce namedtuple un objet livre
 Afficher les noms des champs du namedtuple
 Afficher les informations du livre de la manière suivantes : Attribut : valeur.
Utilisez les dictionnaires
 Remplacez le prix du livre par 200. Vérifier ensuite la modification

105

Les Collections : Deque

Pr Bendahmane

44
30/05/2022

Deque : liste qui permet


d’insérer au début et à la fin
Collections - deque
• Les listes Python sont une séquence d'éléments ordonnés, mutable ou modifiable.
• Python peut ajouter des listes en temps constant mais l'insertion au début d'une liste peut être plus lente (le temps nécessaire augmente à
mesure que la liste s'agrandit).
Exemple :
favorite_list = ["Sammy", "Jamie", "Mary"]
favorite_list.insert(0, "Alice") # insérer "Alice" au début de favorite_list
print(favorite_list) #affiche ['Alice', 'Sammy', 'Jamie', 'Mary']

• La classe deque du module collections est un objet de type liste qui permet d'insérer des éléments au début ou à la fin d'une séquence
avec une performance à temps constant (O(1)).
• O(1) performance signifie que le temps nécessaire pour ajouter un élément au début de de liste n'augmentera pas, même si cette liste a
des milliers ou des millions d'éléments.
PARTIE 3

1
0

deque

Collections - deque
• Les fonctions append(x), appendleft(x): append ajoute
une seule valeur du côté droit(à la fin) du deque et
appendleft du côté gauche(au début))

from collections import deque


favorite_deque = deque(["Sammy", "Jamie", "Mary"])
favorite_deque.appendleft("Alice") #ajout au début de favorite_fish_deque
favorite_deque.append("Bob") #ajout à la fin de favorite_fish_deque
print(favorite_deque) #affiche deque(['Alice', 'Sammy', 'Jamie', 'Mary', 'Bob'])

• Les fonctions pop(), popleft() et clear(): pop() et


popleft() permettent de faire sortir un objet d’un deque
et clear() le vide.
from collections import deque
PARTIE 3

favorite_deque = deque(['Alice', 'Sammy', 'Jamie', 'Mary', 'Bob'])


favorite_deque.pop() #affiche Bob
favorite_deque.popleft() #affiche: Alice
print(favorite_deque.clear()) #affiche None
1
0

45
30/05/2022

deque

Exercice

 Que devez vous changer dans le premier exercice sur les listes pour utiliser
les deque ?

46
30/05/2022

111

Les Collections : ChainMap

Pr Bendahmane

ChainMap

Collections - ChainMap
• La classe collections.ChainMap permet de linker plusieurs mappings
pour qu’ils soient gérés comme un seul.
• class collections.ChainMap(*maps) cette fonction retourne une
nouvelle ChainMap. Si il n’y a pas de maps spécifiés en paramètres la
ChainMap sera vide.
Exemple : from collections import ChainMap
x = {'a': 1, 'b': 2}
y = {'b': 10, 'c': 11}
z = ChainMap(y, x)
for k, v in z.items(): #parcourir les éléments de z
print(k, v)
#affiche:
#a 1
PARTIE 3

#b 10
C# 11

• Dans l'exemple précédent on remarque que la clé b a pris la valeur


10 et pas 2 car y est passé avant x dans le constructeur de ChainMap.
1
Copyright - Tout droit réservé -
OFPPT 1

47
30/05/2022

113

Les Collections : Counter

Pr Bendahmane

Counter

Collections - Counter
• La classe collections.Counter est une sous-classe de dict.
qui permet de compter des objets hachable.
• En fait c’est un dictionnaire avec comme clé les éléments
et comme valeurs leur nombre.
• class collections.Counter([iterable-or-mapping]) ceci
retourne un Counter. L’argument permet de spécifier ce
que l’on veut mettre dedans et qui doit être compté.
Exemple :
from collections import Counter
c = Counter() # compteur vide
print(c) # affiche: Counter()
c = Counter('gallahad') #compteur avec un iterable
print(c) #affiche Counter({'a': 3, 'l': 2, 'g': 1, 'h': 1, 'd': 1})
PARTIE 3

c = Counter({'red': 4, 'blue': 2}) # un compteur avec un mapping


print(c) #affcihe: Counter({'red': 4, 'blue': 2})
c = Counter(cats=4, dogs=8) #un compteur avec key=valeur
print(c) #affcihe: Counter({'dogs': 8, 'cats': 4})
1
Copyright - Tout droit réservé -
OFPPT 1

48
30/05/2022

Counter

Collections - Counter
• Si on demande une valeur n’étant pas dans notre liste il retourne 0 et non pas KeyError

from collections import Counter


c = Counter(['eggs', 'ham'])
c['bacon’] # clé inconnue, affiche: 0

• La fonction elements(): retourne une liste de tous les éléments du compteur :

from collections import Counter


c = Counter(a=4, b=2, c=0, d=-2)
sorted(c.elements()) #affiche ['a', 'a', 'a', 'a', 'b', 'b']

• La fonction most_common([n]): retourne les n éléments les plus présents dans le compteur
PARTIE 3

from collections import Counter


c = Counter('abracadabra').
Print(c. most_common(3)) #affiche [('a', 5), ('b', 2), ('r', 2)]

1
1

Counter

Collections - Counter
• La fonction substract([iterable or mapping]) : permet de soustraire des éléments d’un
compteur (mais pas de les supprimer)

from collections import Counter


c = Counter(a=4, b=2, c=0, d=-2)
d = Counter(a=1, b=2, c=3, d=4)

print(c.subtract(d)) #affcihe Counter({'a': 3, 'b': 0, 'c': -3, 'd': -6})


PARTIE 3

1
Copyright - Tout droit réservé -
OFPPT 1

49
30/05/2022

118

Les Collections : OrderDict

Pr Bendahmane

50
30/05/2022

OrderDict
119

Collections - OrdredDict
• Les collections.OrderedDict sont comme les dict. mais ils Exemple :
se rappellent l’ordre d’entrée des valeurs. Si on itère
dessus les données seront retournées dans l’ordre d’ajout from collections import OrderedDict
dans notre dict. d=OrderedDict()
• La fonction popitem(last=True) : fait sortir une paire clé d['a']=‘1’ #remplir d
d['b']='2'
valeur de notre dictionnaire et si l’argument last est a
d['c']='3'
‘True’ alors les pairs seront retournées en LIFO sinon ce d['d']='4’
sera en FIFO.
• La fonction move_to_end(key, last=True) : permet de d.move_to_end('b’)
déplacer une clé à la fin de notre dictionnaire si last est à print(d) #affiche OrderedDict([('a', '1'), ('c', '3'), ('d', '4'), ('b', '2')])
True sinon au début de notre dict.
d.move_to_end('b',last=False)
print(d) #affiche OrderedDict([('b', '2'), ('a', '1'), ('c', '3'), ('d', '4')])
print(d.popitem(True)) #affiche ('d', '4')
PARTIE 3

print(d) #affiche OrderedDict([('b', '2'), ('a', '1'), ('c', '3')])

Copyright - Tout droit réservé - OFPPT

120

Les Collections : Counter

Pr Bendahmane

51
30/05/2022

Defaultdict
121

Collections - defaultdict
• defaultdict du module de collections qui permet de
rassembler les informations dans les dictionnaires de
manière rapide et concise.
• defaultdict ne soulève jamais une KeyError.
from collections import defaultdict
• Si une clé n'est pas présente, defaultdict se contente
d'insérer et de renvoyer une valeur de remplacement à la my_defaultdict =defaultdict(list)
place. print(my_defaultdict["missing"]) #affcihe []
• defaultdict se comporte différemment d'un dictionnaire
ordinaire. Au lieu de soulever une KeyError sur une clé
manquante, defaultdict appelle la valeur de
remplacement sans argument pour créer un nouvel objet.
Dans l’exemple ci-dessous, list() pour créer une liste vide.
PARTIE 3

Copyright - Tout droit réservé - OFPPT

Defaultdict

Collections - defaultdict from collections import defaultdict


def default_message():
return "key is not there"

defaultdcit_obj= defaultdict(default_message)
Remplissage d’un defaultdict
defaultdcit_obj["key1"]="value1"

defaultdcit_obj["key2"]="value2 » Affichage des éléments d’un defaultdict


print(defaultdcit_obj["key1"]) #affiche: value1
print(defaultdcit_obj["key2"]) #affiche: value2

print(defaultdcit_obj["key3"]) #affiche: key is not there Si la clé n’existe pas alors appeler la fonction default_message

from collections import defaultdict


defaultdcit_obj= defaultdict(lambda: "key is missing") #déclaration d’une fonction lambda pour afficher un message
PARTIE 3

defaultdcit_obj["key1"]="value1"
Utilisation de la
fonction lambda defaultdcit_obj["key2"]="value2"
print(defaultdcit_obj["key1"]) #affiche: value1
print(defaultdcit_obj["key2"]) #affiche: value2
print(defaultdcit_obj["key3"]) #appel de la fonction lambda, affiche: key is missing
1
2

52
30/05/2022

Defaultdict

Collections - defaultdict
• Lorsque la classe int est fournie comme fonction par défaut, la valeur par défaut retournée est zéro.
from collections import defaultdict
defaultdcit_obj =defaultdict(int)
defaultdcit_obj["key1"]="value1"
defaultdcit_obj["key2"]="value2"
print(defaultdcit_obj["key1"]) #affiche: value1
print(defaultdcit_obj["key2"]) #affiche: value2
print(defaultdcit_obj["key3"]) #affiche: 0

• Nous pouvons également utiliser l'objet Set comme objet par défaut

from collections import defaultdict


defaultdcit_obj =defaultdict(set)
PARTIE 3

defaultdcit_obj["key1"]="value1"
defaultdcit_obj["key2"]="value2"
print(defaultdcit_obj["key1"]) #affiche: value1
print(defaultdcit_obj["key2"]) #affiche: value2
print(defaultdcit_obj["key3"]) #affiche: set()
1
Copyright - Tout droit réservé -
OFPPT 2

Exercice

 Refaire l’exercice des collections sur les livres en utilisant defaultdict au lieu
d’une liste

53
30/05/2022

54

Vous aimerez peut-être aussi