Vous êtes sur la page 1sur 49

Langage de Programmation Evolué - BI

L3 BI-EBUS

Chapitre 5 : Programmation Orientée Objet

Haïfa Nakouri

hayfa.nakouri@esen.tn

ESEN Manouba

2021/2022
Objectifs du chapitre

 Créer des classes pour définir des objets


 Écrire des méthodes et créer des attributs pour des
objets
 Instancier des objets à partir de classes
 Restreindre l’accès aux attributs d’un objet
 Comprendre des fonctionnalités des programmes
OO telles que le polymorphisme, l’encapsulation et
l’héritage
 Pouvoir choisir entre différents styles de
programmation à des fins différentes

Haïfa Nakouri LPE-BI ESEN 2021/2022 2


1- Programmation OO avec Python

Haïfa Nakouri LPE-BI ESEN 2021/2022 3


Tout est objet !

 La programmation en Python se fait généralement


de manière orientée objet

"hello".uppper()
list3.append(‘a’)
dict2.keys()

 Nous pouvons également concevoir nos propres


objets en plus de ces types de données

Haïfa Nakouri LPE-BI ESEN 2021/2022 4


Classe- Exemple

Nom de la Classe

Attribut:

Gear
speed
Méthodes:

Speed up
Change gear
Apply brake

Haïfa Nakouri LPE-BI ESEN 2021/2022 5


Définir une classe

 Une classe est un type de données spécial qui


définit comment construire un certain type d’objet
 La classe stocke également certains éléments de
données partagés par toutes les instances de cette
classe.
 Les instances sont des objets créés qui suivent la
définition donnée dans la classe.

 Python n’utilise pas des interface de classe


distinctes comme dans certains langages. On définit
simplement la classe et on l’utilise.

Haïfa Nakouri LPE-BI ESEN 2021/2022 6


Example : Définition de la classe « student »

Haïfa Nakouri LPE-BI ESEN 2021/2022 7


Instancier un objet

 On utilise simplement le nom de la classe avec la


notation () et on affecte le résultat à une variable.

 Les arguments passés au nom de la classe sont en


réalité passés à la méthode __init__

Haïfa Nakouri LPE-BI ESEN 2021/2022 8


Constructeur __init__
Deux tirets bas concaténés

 En POO, le constructeur est une méthode spéciale


d’une classe qui initialise un objet du même type
 En python, __init__ est une méthode spéciale qui
implémente le constructeur de classe.
 Lorsqu’on crée une instance d’une classe c’est la
méthode __init__ qui est appelée et qui effectue
habituellement l’initialisation des attributs
 Les arguments qu’on passe lors de l’instanciation
d’un objet sont transmis à la méthode __init__.
 Example : On passe ”Ahmed” and 20 au
constructeur __init__.
Haïfa Nakouri LPE-BI ESEN 2021/2022 9
Constructeur __init__

 La méthode __init__ peut prendre n’importe quel


nombre d’arguments

 Tout comme d’autres fonctions ou méthodes, les


arguments peuvent être définis avec des valeurs
par défaut les rendant facultatifs pour l’appelant.

 Le premier argument self dans la définition


__init__ est spécial…

Haïfa Nakouri LPE-BI ESEN 2021/2022 10


Self Similaire à ‘this’ en java ou en C++

 Le premier argument de chaque méthode est une référence à


l’instance actuelle de la classe.
 Par convention, ce premier argument est nommé self.
 Dans __init__, self fait référence à l’objet en cours de création ;
 Dans d’autres méthodes de classe, il fait référence à l’instance
dont la méthode a été appelée

Haïfa Nakouri LPE-BI ESEN 2021/2022 11


Accès aux attributs et aux méthodes

Méthodes pour accéder aux attributs

Les deux méthodes permettent


l’accès à l’attribut age.

Haïfa Nakouri LPE-BI ESEN 2021/2022 12


Définir les méthodes de classes

• Outre le constructeur, la plupart des classes définissent des


méthodes supplémentaires qui permettent de lire ou de mettre à
jour les attributs de l’objet ou de manipuler l’objet en question.

• Les méthodes déclarent toujours un paramètre explicite (self) au


début de la liste des paramètres, tout comme le constructeur. Une
définition de méthode ressemble à :

def method_name(self, other parameters):


. . . body of the method . . .

• self fait référence à l’objet courant (en cours de création). Quand on


appelle la méthode, il fait référence à l’instance dont la méthode a
été appelée

Haïfa Nakouri LPE-BI ESEN 2021/2022


Self

 self doit être explicitement invoqué lors de la


définition de la méthode, mais …
 Il ne doit pas être mentionné lors de l’appel de la
fonction
 Python le fait passer automatiquement,

Définir une méthode de classe Appeler une méthode de classe


Fais ceci

Ne fais pas cela

Haïfa Nakouri LPE-BI ESEN 2021/2022 14


Getters et Setters
 Connus également sous les noms d’Accesseurs et
de Mutateurs, respectivement.
 Getters/Accesseurs sont des méthodes qui
retournent un attribut

 Setters/Mutateurs sont des méthodes qui


modifient un attribut

Haïfa Nakouri LPE-BI ESEN 2021/2022 15


Getter

 Définition d’un Getter

Exemple : enregistrer le nom en tant que


« firstName » et « lastName » dans la classe
 Le getter nous permet de faire cela :

Haïfa Nakouri LPE-BI ESEN 2021/2022 16


Setter

 Définition d’un Setter :

Exemple : Ajouter un contrôle sur l’âge et le valider :


 Le setter nous permet de faire ça

Haïfa Nakouri LPE-BI ESEN 2021/2022 17


Pourquoi les Getters et les Setters

 La programmation procédurale ne propose pas une


méthode convenable pour cacher or protéger les données
 Moins sécurisée
 POO offre la la protection des données
 Cacher les données est la capacité d’un objet à masquer
ses données (attributs + méthodes) des autres objets du
programme  fournit plus de sécurité
 Les Getters et Setters cachent la structure interne d’une
classe et doivent être utilisés juste pour cela.

 Les Getters and setters sont utiles pour assurer


l’encapsulation des données

Haïfa Nakouri LPE-BI ESEN 2021/2022 18


Attributs et méthodes privés/publiques

 Attributs Publiques : toute autre classe ou fonction


peut voir et modifier l’attribut de ma classe
 Attributs Privés : toute autre classe ou fonction peut
appeler les méthodes de ma classe
 Les attributs et méthodes en Python sont publiques
par défaut.
 On peut les rendre privés en ajoutant « __ » (double
tirets bas) comme préfix au nom:
 Self.__attributeName = value
#Attribut privé
 Def __MethodName() :
#Méthode privée

Haïfa Nakouri LPE-BI ESEN 2021/2022 19


Attributs et méthodes privés/publiques

 Les attributs privés ne sont (presque) accessibles


que par les méthodes définies dans la classe

 Les méthodes privées ne peuvent (presque) être


appelées que par d’autres méthodes définies dans la
classe

 Principe : Tout ce qui est défini dans la classe a


accès à ses éléments privés (attributs et méthodes).

Haïfa Nakouri LPE-BI ESEN 2021/2022 20


Public/Private attributes and methods

En désignant les
attributs comme
« privés », le codage
pour y accéder devient
plus compliqué

L’utilisation de
Getters et Setters
est nécessaire pour
accéder aux variables
d’instance d’un objet
ou les modifier0

Haïfa Nakouri LPE-BI ESEN 2021/2022 21


Pas besoin de « libérer »

 Lorsque l’on a terminé avec un objet, on n’a pas besoin


de le supprimer ou de le libérer explicitement

 Python possède un ramasse-miettes automatique

 Il détectera automatiquement quand toutes les


références à un espace mémoire sont hors de portée
 libère automatiquement cette mémoire

 Marche bien avec les fuites de mémoires

 Il n’existe pas non plus de méthode destructeur

Haïfa Nakouri LPE-BI ESEN 2021/2022 22


Exercise 1

Écrire une classe Python nommée Rectangle


construite par les attributs longueur et largeur et
une méthode qui calcule l’aire d’un rectangle.

Haïfa Nakouri LPE-BI ESEN 2021/2022 23


Exercise 1 - Solution

Haïfa Nakouri LPE-BI ESEN 2021/2022 24


2- Héritage

Haïfa Nakouri LPE-BI ESEN 2021/2022 25


Héritage
 Une classe peut étendre la définition d’une autre classe
déjà existante afin d’utiliser (ou de redéfinir) ses
méthodes et ses attributs déjà définis.
 Héritage
 Nouvelle classe  classe fille. Example L3Student
 Class originale  classe mère . Example : student

 Quand on définit une sous-classe , on met le nom de la


classe mère entre parenthèses après le nom de la classe
fille

 L’héritage multiple est possible.


 Une classe dérivée peut hériter d’une ou de plusieurs classes
mères

Haïfa Nakouri LPE-BI ESEN 2021/2022 26


Définition d’une classe fille

Haïfa Nakouri LPE-BI ESEN 2021/2022 27


Redéfinition des méthodes

 Dans la classe fille, il est possible de redéfinir une


méthode de la classe mère pour qu’elle exécute un
traitement différent
 Cas 1 : Dans la classe fille, on redéfinit carrément le
contenu de la méthode héritée tout en gardant le
nom d’origine.
L’ancien code ne sera pas exécuté
 Cas 2 : Si on souhaite exécuter l’ancien code, il faut
explicitement appeler la méthode avec sa version
héritée
ClasseMère.NomMéthode(self, a, b, c)

L’unique fois où le « self » est explicitement passé comme argument, c’est


LPE-BIune méthode héritée
Haïfa Nakouri lorsque nous appelons ESEN 2021/2022 28
d’une classe mère
Redéfinir la méthode __init__

 Similaire à la redéfinition de n’importe quelle méthode


 Dans ce cas (cas 2 au slide précédent), il est fréquent
d’exécuter la méthode __init__ héritée de la classe mère
tout en lui ajoutant de nouvelles commandes.
 La méthode __init__ de la classe fille est souvent écrite
selon le format suivant :
ClasseMère.__init__(self, x, y)

 Où ClasseMère est le nom de la classe mère (ancêtre)

Exemple
précédent :

Haïfa Nakouri LPE-BI 29


Polymorphisme

Polymorphisme :
la possibilité de surcharger
les opérateurs standard afin
qu’ils aient un
comportement approprié en
fonction de leur contexte

La méthode ‘filght()’ est


surchargée dans les
classes filles pour afficher
le message approprié pour
chaque type d’oiseau

LPE-BI ESEN 2021/2022 30


POLYMORPHISM

Haïfa Nakouri LPE-BI ESEN 2021/2022 31


Exercice 2

Dériver la classe Contact des classes de base


Person et Address et utiliser leurs méthodes pour
imprimer les informations des contacts.

Haïfa Nakouri LPE-BI ESEN 2021/2022 32


Exercice 2 - Solution

Haïfa Nakouri LPE-BI ESEN 2021/2022 33


Exercice 2 - Solution

Haïfa Nakouri LPE-BI ESEN 2021/2022 34


Exercice 2 - Solution

Haïfa Nakouri LPE-BI ESEN 2021/2022 35


Exercice 2 - Solution

Haïfa Nakouri LPE-BI ESEN 2021/2022 36


Evaluation

 Que retournent les programmes suivants?

class Sales:
def __init__(self, id):
self.id = id
id = 100

val = Sales(123)
print (val.id)
Output :
123

Haïfa Nakouri LPE-BI ESEN 2021/2022 37


Evaluation
class A:
 Que retourne le code suivant ?
def __init__(self, i = 0):
self.i = i

class B(A):
def __init__(self, j = 0):
self.j = j

def main():
b = B()
print(b.i)
print(b.j)
Output :
main() AttributeError: 'B' object has no
Haïfa Nakouri attribute
LPE-BI 'i' ESEN 2021/2022 38
Evaluation
class A:
def __init__(self, i = 0):
self.i = i

class B(A):
def __init__(self, j = 0):
A.__init__(self,i=0)
self.j=0
def main():
b = B()
print(b.i, end='\t')
print(b.j)

main() Output :
Haïfa Nakouri LPE-BI 0 2021/20220
ESEN 39
Evaluation
class A:
def __init__(self):
self.calcI(30)
print("i from A is", self.i)

def calcI(self, i):


self.i = 2 * i;

class B(A):
def __init__(self):
A.__init__(self)

def calcI(self, i):


self.i = 3 * i;

b = B() Output :
Haïfa Nakouri i from A is 90
LPE-BI ESEN 2021/2022 40
Evaluation
class A:
def __init__(self):
self.calcI(30)

def calcI(self, i):


self.i = 2 * i;

class B(A):
def __init__(self):
A.__init__(self)
print("i from B is", self.i)

def calcI(self, i):


self.i = 3 * i;

b = B()
Output :
Haïfa Nakouri i from B is 90
LPE-BI ESEN 2021/2022 41
3- Attributs et méthodes prédéfinie

Haïfa Nakouri LPE-BI ESEN 2021/2022 42


Elements prédéfinis

 Les classes contiennent de nombreux méthodes et


attributs qui sont toujours inclus

 La plupart définissent une fonctionnalité déclenchée


automatiquement par des opérateurs spéciaux ou par
l’utilisation d’une classe

 Les attributs prédéfinis définissent des informations


enregistrées pour toutes les classes.

 Tous les éléments prédéfinis en Python sont entourés par


doubles tirets-bas : __init__ __doc__

Haïfa Nakouri LPE-BI ESEN 2021/2022


Méthodes spéciales

 La méthode __str__ existe pour toutes les classes, et


on peut à tout moment la redéfinir (ou __repr__)

 __str__ spécifie comment transformer une instance de


classe en une chaîne de caractères

 Print(f) appelle f.__str__() pour produire une


chaîne pour objet f

Haïfa Nakouri LPE-BI ESEN 2021/2022


Méthodes spéciales : Example 1
class User:
def __init__(self, fn, ln):
self.firstName = fn
self.lastName = ln

def __str__(self):
return "User information " + self.firstName \
+ " " + self.lastName

user1= User("Barack","Obama")
print(user1)

User information Barack Obama

Haïfa Nakouri LPE-BI ESEN 2021/2022


Méthodes spéciales

 On peut également redéfinir :

__init__ : le constructeur de classe

__gt__, __le__, __ge__, __eq__, et __ne__ :


Définir comment >, <=, >=, … fonctionnent dans la classe

__len__ : Définir comment len( obj ) fonctionne pour


les objets de la classe

__copy__ : Définir comment copier une classe

Haïfa Nakouri LPE-BI ESEN 2021/2022


Méthodes spéciales : exemple 2
class User:
"""this class describes a user """
def __init__(self, fn, ln):
self.firstName = fn
self.lastName = ln
user1= User("Barack"," Obama")
user2= User("Barack"," Obama") False
print(user1==user2)

class User:
"""this class describes a user """
def __init__(self, fn, ln):
self.firstName = fn
self.lastName = ln
def __eq__(self, other):
return (self.firstName==other.firstName and
self.lastName==other.lastName)
user1= User("Barack","Obama")
user2= User("Barack","Obama")
print(user1==user2)
Haïfa Nakouri LPE-BI ESEN 2021/2022 True47
Eléments de données spéciaux
 Ces attributs existent pour toutes les classes.

__doc__ : Variable renvoyant la docstring appartenant à la


classe

__class__ : Variable qui renvoie le nom de classe d’un objet

__module__ : Variable qui renvoie le module dans lequel la classe


est définie

 Utile …

 __dir__() : renvoie une liste de toutes les méthodes et attributs


définis pour l’objet x

Haïfa Nakouri LPE-BI ESEN 2021/2022


Special Data Items – Example
class User:
"""this class describes a user """
def __init__(self, fn, ln):
self.firstName = fn
self.lastName = ln
def __str__(self):
return "User information: " +self.firstName \
+ " " + self.lastName
user1= User("Barack","Obama")

print(user1.__class__)
print(user1.__doc__)

<class '__main__.User'>
this class describes a user

Haïfa Nakouri LPE-BI ESEN 2021/2022

Vous aimerez peut-être aussi