Programmation Orientée Objet en Python
Programmation Orientée Objet en Python
Achref El Mouelhi
[Link]@[Link]
1 Introduction
2 Classe
str ()
repr ()
init ()
Setter
Getter
property()
Deleter
@property
del ()
Attributs et méthodes statiques
3 Héritage
Héritage simple
Héritage multiple
4 Polymorphisme
Surcharge
Redéfinition
6 Indexeur
getitem ()
setitem ()
len ()
7 Itérateur
8 Opérateur
eq ()
gt ()
add ()
9 Généricité
10 Énumération
11 Introspection
12 Conventions
Python
Qu’est ce qu’une classe en POO ?
Python
Qu’est ce qu’une classe en POO ?
Python
Qu’est ce qu’une classe en POO ?
Python
Qu’est ce qu’une classe en POO ?
Python
NomClasse
I c
les attributs
ELH
U
L MO
r e f E
les méthodes
ch
c A
Attribut : [visibilité] + type + nom
Méthode : [visibilité] + valeur de retour + nom + arguments ≡
signature : exactement comme les fonctions en procédurale
Python
Particularité de Python I
c
H
EL classe mère
U
Toutes les classes héritent implicitement d’une
Object.
L MO
r e E désigner l’objet courant.
f de
A c h
Le mot-clé self permet
Python
I
c
Démarche
E L H
U
MO
Utilisez PyCharm pour créer un nouveau projet cours-poo dans
votre espace de travail L
f Ede créer un fichier [Link]
c h
Cochez la case qui r e
permet
c A
Python
Considérons la classe Personne définie dans [Link]
class Personne:
pass
I c
ELH
U
L MO
f E
chre
c A
Python
Considérons la classe Personne définie dans [Link]
class Personne:
pass
I c
Dans [Link], instancions la classe Personne
ELH
U
MO
p = Personne()
f E L
chre
c A
Python
Considérons la classe Personne définie dans [Link]
class Personne:
pass
I c
Dans [Link], instancions la classe Personne
ELH
U
MO
p = Personne()
f E L
chre
N’oublions d’importer la classe Personne
c A
from personne import Personne
Python
Considérons la classe Personne définie dans [Link]
class Personne:
pass
I c
Dans [Link], instancions la classe Personne
ELH
U
MO
p = Personne()
f E L
chre
N’oublions d’importer la classe Personne
c A
from personne import Personne
Et si on affiche l’instance
print(p)
# affiche <[Link] object at 0x00D28160>
Python
Dans une classe, on peut déclarer des attributs (et les initialiser)
class Personne:
num: int
nom: str
prenom: str
I c
ELH
U
L MO
f E
chre
c A
Python
Dans une classe, on peut déclarer des attributs (et les initialiser)
class Personne:
num: int
nom: str
prenom: str
I c
ELH
U
MO
Pour affecter des valeurs aux différents attributs
from personne import Personne
f E L
p = Personne()
chre
c A
[Link] = 100
[Link] = ’wick’
[Link] = "john"
Python
Dans une classe, on peut déclarer des attributs (et les initialiser)
class Personne:
num: int
nom: str
prenom: str
I c
ELH
U
MO
Pour affecter des valeurs aux différents attributs
from personne import Personne
f E L
p = Personne()
chre
c A
[Link] = 100
[Link] = ’wick’
[Link] = "john"
Python
Explication
Pour afficher les détails d’un objet, il faut que la méthode str (self) soit implémentée
I c
ELH
U
L MO
f E
chre
c A
Python
Explication
Pour afficher les détails d’un objet, il faut que la méthode str (self) soit implémentée
I c
Définissons la méthode str ()
ELH
U
class Personne:
num: int
L MO
f E
hre
nom: str
prenom: str
c
c A
def __str__(self) -> str:
return [Link] + " " + [Link]
Python
Explication
Pour afficher les détails d’un objet, il faut que la méthode str (self) soit implémentée
I c
Définissons la méthode str ()
ELH
U
class Personne:
num: int
L MO
f E
hre
nom: str
prenom: str
c
c A
def __str__(self) -> str:
return [Link] + " " + [Link]
print(p)
# affiche john wick
Python
Python
Python
class Personne:
num: int
nom: str
prenom: str
I c
ELH
def __str__(self) -> str:
U
MO
return "prénom : " + [Link] + " " + "nom : " + [Link]
L
def __repr__(self) -> str:
f E
hre
return [Link] + " " + [Link]
c
c A
Python
class Personne:
num: int
nom: str
prenom: str
I c
ELH
def __str__(self) -> str:
U
MO
return "prénom : " + [Link] + " " + "nom : " + [Link]
L
def __repr__(self) -> str:
f E
hre
return [Link] + " " + [Link]
c
c A
Exécutons le [Link] précédent sans le changer
print(p)
# affiche prénom : john nom : wick
Python
I c
p = Personne()
[Link] = 100 ELH
U
[Link] = ’wick’
L MO
[Link] = "john"
f E
chre
print(f"{p}")
c A
# prénom : john nom : wick
print(f"{p!r}")
# john wick
Python
Python
Remarques
I c
H
Pour simplifier la création d’objets, on peut définir un nouveau
EL
U
constructeur qui prend en paramètre plusieurs attributs de la
classe
L MO
f E
chre
c A
Python
Remarques
I c
H
Pour simplifier la création d’objets, on peut définir un nouveau
EL
U
constructeur qui prend en paramètre plusieurs attributs de la
classe
L MO
f E
A c hre
c
avec Python
Les constructeurs
Python
Le constructeur de la classe Personne acceptant trois paramètres
class Personne:
def __init__(self, num: int, nom: str, prenom: str):
[Link] = num
[Link] = nom
[Link] = prenom
def __str__(self) -> str:
I c
return [Link] + " " + [Link]
ELH
U
L MO
f E
chre
c A
Python
Le constructeur de la classe Personne acceptant trois paramètres
class Personne:
def __init__(self, num: int, nom: str, prenom: str):
[Link] = num
[Link] = nom
[Link] = prenom
def __str__(self) -> str:
I c
return [Link] + " " + [Link]
ELH
U
L MO
f E
En testant le main précédent, une erreur sera générée
from personne import Personne
chre
p = Personne()
[Link] = 100
c A
[Link] = ’wick’
[Link] = "john"
print(p)
# affiche TypeError: __init__() missing 3 required positional arguments
: ’num’, ’nom’, and ’prenom’
Python
Explication
c
Le constructeur par défaut a été écrasé (il n’existe plus)
I
ELH
U
L MO
f E
chre
c A
Python
Explication
c
Le constructeur par défaut a été écrasé (il n’existe plus)
I
ELH
U
L MO
f E
hre
Comment faire ?
c
surcharge)
c A
Python n’autorise pas la présence de plusieurs constructeurs (la
On peut utiliser les valeurs par défaut
Python
Python
I c
p = Personne()
ELH
[Link] = 100
U
[Link] = ’wick’
L MO
[Link] = "john"
f E
chre
c A
p2 = Personne(100, ’wick’, ’john’)
print(p2)
# affiche john wick
Python
Hypothèse
Python
Hypothèse
Python
Particularité de Python
I
c
Le mot-clé private n’existe pas
EL H
On préfixe les attributs par deuxM O U
underscores pour indiquer qu’ils
sont privés
fE L
h r e
cattributs par un underscore pour indiquer qu’ils sont
protég
c
és
A
On préfixe les
Ajoutons deux underscrores à tous les attributs et définissons un setter pour chaque
attribut
class Personne:
def __init__(self, num: int = 0, nom: str = ’’, prenom: str = ’’):
self.__num = num
self.__nom = nom
self.__prenom = prenom
I c
def set_num(self, num: int) -> None:
ELH
U
MO
if num > 0:
self.__num = num
else:
f E L
hre
self.__num = 0
c
c A
def set_nom(self, nom: str) -> None:
self.__nom = nom
Python
I c
p = Personne(100, ’wick’, ’john’)
ELH
U
print(p)
L MO
# affiche 100 john wick
f E
chre
p.set_num(-100) c A
print(p)
# affiche 0 john wick
Python
print(p)
# affiche 0 john wick
class Personne:
def __init__(self, num: int = 0, nom: str = ’’, prenom: str = ’’):
self.set_num(num)
self.__nom = nom
self.__prenom = prenom
I c
def set_num(self, num: int) -> None:
ELH
if num > 0:
U
self.__num = num
else:
L MO
f E
hre
self.__num = 0
c
c A
def set_nom(self, nom: str) -> None:
self.__nom = nom
Python
print(p)
# affiche 0 john wick
Python
Question
I c
Comment récupérer les attributs (privés) de la classe Personne ?
ELH
U
L MO
f E
chre
c A
Python
Question
I c
Comment récupérer les attributs (privés) de la classe Personne ?
ELH
U
L MO
f E
Démarche
chre
c A
Définir des méthodes qui retournent les valeurs des attributs (les
getter)
class Personne:
def __init__(self, num: int = 0, nom: str = ’’, prenom: str = ’’):
self.set_num(num)
self.__nom = nom
self.__prenom = prenom
I c
def set_num(self, num: int) -> None:
if num > 0:
ELH
self.__num = num
U
MO
else:
L
self.__num = 0
f E
hre
def get_nom(self) -> str:
return self.__nom
c
c A
def set_nom(self, nom: str) -> None:
self.__nom = nom
Python
Pour tester
I c
from personne import Personne
EL H
U
L MO
p = Personne(100, ’wick’, ’john’)
h r e fE
A
# affichec100
c
print(p.get_num(), p.get_nom(), p.get_prenom())
wick john
Python
I c
La méthode property() permet
ELH
U
d’indiquer les setter et getter
L MO
f E
hre
de les utiliser comme un attribut
c
c A
Python
Ajoutons property dans la classe Personne
class Personne:
def __init__(self, num: int = 0, nom: str = ’’, prenom: str = ’’):
[Link] = num
self.__nom = nom
self.__prenom = prenom
I c
return self.__num
def set_num(self, num: int) -> None:
ELH
U
if num > 0:
MO
self.__num = num
else:
self.__num = 0
f
num = property(get_num, set_num)
E L
def get_nom(self) -> str:
c hre
c A
return self.__nom
def set_nom(self, nom: str) -> None:
self.__nom = nom
nom = property(get_nom, set_nom)
Python
Pour tester
from personne import Personne
p = Personne(100, ’wick’, ’john’)
I c
ELH
U
print(p)
L MO
# affiche 100 john wick
f E
chre
c A
[Link] = -100
print([Link], [Link], [Link])
# affiche 0 wick john
Python
I c
Le deleter permet
E LH
de supprimer un attribut d’un objet O U
L M
ref
de ne plus avoir accès à E
un attribut
c h
c A
Python
c h ref
c A
def del_prenom(self) -> None:
del self.__prenom
Python
Pour tester
from personne import Personne
I c
p = Personne(100, ’wick’, ’john’)
ELH
U
print(p)
L MO
# affiche 100 wick john
f E
chre
del [Link]
c A
print(p)
# affiche AttributeError: ’Personne’ object has no
attribute ’__prenom’
Python
I c
de ne pas déclarer les getter et setter avec dans property()
ELH
U
L MO
f E
chre
c A
Python
I c
de ne pas déclarer les getter et setter avec dans property()
ELH
U
L MO
f E
hre
Pour générer les propriétés avec PyCharm
c
c A
saisissez prop
choisissez si vous voulez le getter, getter et setter, getter, setter et
deleter
validez en cliquant sur entrée
class Personne:
def __init__(self, num: int = 0, nom: str = ’’, prenom: str = ’’):
[Link] = num
self.__nom = nom
self.__prenom = prenom
@property
def num(self) -> int:
return self.__num
@[Link]
I c
H
def num(self, num) -> None:
EL
if num > 0:
self.__num = num
U
MO
else:
self.__num = 0
@property
def nom(self) -> str:
f E L
hre
return self.__nom
@[Link]
c
c A
def nom(self, nom) -> None:
self.__nom = nom
@property
def prenom(self) -> str:
return self.__prenom
@[Link]
def prenom(self, prenom) -> None:
self.__prenom = prenom
@[Link]
def prenom(self) -> str:
del self.__prenom
def __str__(self) -> str:
return str(self.__num) + " " + self.__prenom + " " + self.__nom
Python
Pour tester
from personne import Personne
I c
p = Personne(100, ’wick’, ’john’)
ELH
U
print(p)
L MO
f E
hre
# affiche 100 john wick
c
[Link] = -100 c A
print([Link], [Link], [Link])
# affiche 0 wick john
Python
I
c
del ()
EL H
O
destructeur : exécuté à la destruction de U l’objet
L M
f Eclé dell’objet n’est plus référencé) ou
peut être implicitement (lorsque
r e
A ch
explicitement avec le mot
Python
I c
def __init__(self, num: int = 0, nom: str = ’’,
prenom: str = ’’):
ELH
U
[Link] = num
L MO
f E
hre
self._nom = nom
A c
self._prenom = prenom
c
def __del__(self):
print("destructeur appelé")
# + le contenu précédent
Python
Python
L MO
print(p)
h r e fE
A c
# affiche 100 john wick
c
print("fin du programme")
# affiche fin du programme
# destructeur appelé
Python
Récapitulatif
Les instances d’une même classe ont toutes les mêmes attributs mais pas les mêmes
valeurs
I c
ELH
U
L MO
f E
chre
c A
Python
Récapitulatif
Les instances d’une même classe ont toutes les mêmes attributs mais pas les mêmes
valeurs
I c
ELH
U
Hypothèse
L MO
f E
hre
Et si nous voulions qu’un attribut ait une valeur partagée par toutes les instances (par
c
exemple, le nombre d’objets instanciés de la classe Personne)
c A
Python
Récapitulatif
Les instances d’une même classe ont toutes les mêmes attributs mais pas les mêmes
valeurs
I c
ELH
U
Hypothèse
L MO
f E
hre
Et si nous voulions qu’un attribut ait une valeur partagée par toutes les instances (par
c
exemple, le nombre d’objets instanciés de la classe Personne)
c A
Solution : attribut statique ou attribut de classe
Un attribut dont la valeur est partagée par toutes les instances de la classe.
Python
Exemple
I c
Notre attribut doit être déclaré static, sinon chaque objet pourrait avoir sa propre valeur
pour cet attribut
ELH
U
MO
En Python, un attribut qui n’est pas déclaré dans le constructeur est un attribut static
L
f E
chre
c A
Python
Exemple
I c
Notre attribut doit être déclaré static, sinon chaque objet pourrait avoir sa propre valeur
pour cet attribut
ELH
U
MO
En Python, un attribut qui n’est pas déclaré dans le constructeur est un attribut static
L
f E
chre
c A
Particularité de Python
Un attribut qui n’est pas déclaré dans le constructeur est un attribut statique
Python
Ajoutons un attribut statique nbr personnes à la liste d’attributs de la classe Personne
nbr_personnes = 0
I c
ELH
U
L MO
f E
chre
c A
Python
Ajoutons un attribut statique nbr personnes à la liste d’attributs de la classe Personne
nbr_personnes = 0
I c
H
Incrémentons notre compteur de personnes dans le constructeur
EL
U
def __init__(self, num: int = 0, nom: str = ’’, prenom: str = ’’):
[Link] = num
L MO
self.__nom = nom
f E
hre
self.__prenom = prenom
c
Personne.nbr_personnes += 1
c A
Python
Ajoutons un attribut statique nbr personnes à la liste d’attributs de la classe Personne
nbr_personnes = 0
I c
H
Incrémentons notre compteur de personnes dans le constructeur
EL
U
def __init__(self, num: int = 0, nom: str = ’’, prenom: str = ’’):
[Link] = num
L MO
self.__nom = nom
f E
hre
self.__prenom = prenom
c
Personne.nbr_personnes += 1
c A
Décrémentons dans le destructeur
def __del__(self):
Personne.nbr_personnes -= 1
print("destructeur appelé")
Python
c
print(Personne.nbr_personnes)
# affiche 1
Python
I c
ELH
Pour définir une méthode statique, on utilise
Python
Python
Python
c
print(Personne.nbr_personnes)
# affiche 1
Python
Python
Python
c
print(Personne.nbr_personnes)
# affiche 1
Python
Pour conclure
I c
H
Une méthode d’instance reçoit le mot-clé self comme premier
EL
paramètre
O U
L
Une méthode de classe reçoit leMmot-clé cls comme premier
paramètre
h r e fE
A c
c
Une méthode
paramètre.
static ne reçoit ni self ni cls comme premier
Python
Exercice
Définissez une classe Adresse avec trois attributs privés rue,
code postal et ville de type chaı̂ne de caractère
I
c
setters EL H
Définissez un constructeur avec trois paramètres, les getters et
U
Oattribut adresse (de type
L Mun
Dans la classe Personne, ajouter
r e f E et générez les getter et setter de
Adresse) dans le constructeur
h
A c
ce nouvel attribut
c
Dans [Link], créez deux objets : un objet personne (de type
Personne) et adresse (de type Adresse) et affectez le à l’objet
personne
Affichez tous les attributs de l’objet personne
Python
L’héritage, quand ?
I c
Lorsque deux ou plusieurs classes partagent plusieurs attributs
(et méthodes)
EL H
U
L MO
Lorsqu’une Classe1 est une [sorte de] Classe2
h r e fE
A c
c
Python
L’héritage, quand ?
I c
Lorsque deux ou plusieurs classes partagent plusieurs attributs
(et méthodes)
EL H
U
L MO
Lorsqu’une Classe1 est une [sorte de] Classe2
h r e fE
c
c A
Forme gén
érale
class ClasseFille (ClasseMère):
# code
Python
Exemple
I c
ELH
U
L MO
f E
chre
c A
Python
Exemple
c
Un étudiant a aussi un numéro, un nom, un prénom, un genre et un
I
niveau
ELH
U
L MO
f E
chre
c A
Python
Exemple
c
Un étudiant a aussi un numéro, un nom, un prénom, un genre et un
I
niveau
E LH
U
MOsont une sorte de personne
Sémantiquement, enseignant et étudiant
L
h r e fE
A c
c
Python
Exemple
c
Un étudiant a aussi un numéro, un nom, un prénom, un genre et un
I
niveau
E L H
U
MOsont une sorte de personne
Sémantiquement, enseignant et étudiant
L
r e fE
En plus, les deux partagent
h plusieurs attributs tels que numéro, nom,
c
c A
prénom et genre
Python
Exemple
c
Un étudiant a aussi un numéro, un nom, un prénom, un genre et un
I
niveau
E L H
U
MOsont une sorte de personne
Sémantiquement, enseignant et étudiant
L
r e fE
En plus, les deux partagent
h plusieurs attributs tels que numéro, nom,
c
c A
prénom et genre
Donc, on peut peut utiliser la classe Personne puisqu’elle contient tous
les attributs numéro, nom, prénom et genre
Python
Exemple
c
Un étudiant a aussi un numéro, un nom, un prénom, un genre et un
I
niveau
E L H
U
MOsont une sorte de personne
Sémantiquement, enseignant et étudiant
L
r e fE
En plus, les deux partagent
h plusieurs attributs tels que numéro, nom,
c
c A
prénom et genre
Donc, on peut peut utiliser la classe Personne puisqu’elle contient tous
les attributs numéro, nom, prénom et genre
Contenu de [Link]
class Etudiant(Personne):
def __init__(self, num: int = 0, nom: str = ’’, prenom: str = ’’,
niveau: str = ’’):
super().__init__(num, nom, prenom)
I c
self.__niveau = niveau
ELH
U
MO
@property
def niveau(self) -> str:
return self.__niveau
f E L
hre
@[Link]
c
def niveau(self, niveau) -> None:
c A
self.__niveau = niveau
Contenu de [Link]
class Etudiant(Personne):
def __init__(self, num: int = 0, nom: str = ’’, prenom: str = ’’,
niveau: str = ’’):
super().__init__(num, nom, prenom)
I c
self.__niveau = niveau
ELH
U
MO
@property
def niveau(self) -> str:
return self.__niveau
f E L
hre
@[Link]
c
def niveau(self, niveau) -> None:
c A
self.__niveau = niveau
Remarques
Python
Contenu de [Link]
from personne import Personne
class Enseignant(Personne):
I c
H
L str = ’’,
prenom: str = ’’, salaire:O UE
def __init__(self, num: int = 0, nom:
int = 0):
super().__init__(num, M
self.__salairef=E
L nom, prenom)
c h re salaire
c A
@property
def salaire(self) -> int:
return self.__salaire
@[Link]
def salaire(self, salaire) -> None:
self.__salaire = salaire
Python
Pour créer deux objets Enseignant et Etudiant dans [Link]
from etudiant import Etudiant
from enseignant import Enseignant
f E L
hre
enseignant = Enseignant(300, ’dalton’, ’jack’, 1700)
print(enseignant)
c
c A
# affiche 300 jack dalton
Python
Pour créer deux objets Enseignant et Etudiant dans [Link]
from etudiant import Etudiant
from enseignant import Enseignant
f E L
hre
enseignant = Enseignant(300, ’dalton’, ’jack’, 1700)
print(enseignant)
c
c A
# affiche 300 jack dalton
Remarque
Python
Python
Python
c
A
enseignant = Enseignant(300, ’dalton’, ’jack’, 1700)
print(enseignant)
# affiche 300 jack dalton 1700
Python
Remarques
c
super(Etudiant, self) est une écriture Python simplifiée et
I
remplacée en Python 3 par super().
E L H
U
O ou Enseignant par
En remplaçant super() dans Etudiant
L leM
h r e fE
Personne, le résultat restera même.
A c
super() est conseill é pour appeler les méthodes de la classe
cniveau suivant tant dis que Personne (ou le nom d’une
mère du
classe mère d’un niveau quelconque) permet de préciser le
niveau de la classe mère qu’on cherche à appeler.
TypeScript
Remarque
I c
ELH
U
L MO
f E
chre
c A
TypeScript
Remarque
I c
ELH
U
MO
Exemple
f E L
print(isinstance(enseignant, Enseignant))
# affiche True
chre
c A
print(isinstance(enseignant, Personne))
# affiche True
print(isinstance(p, Enseignant))
# affiche False
Exercice
2 Parcourir le tableau et afficher pour chacun soit le numero s’il est personne, soit le
salaire s’il est enseignant ou soit le niveau s’il est étudiant.
I c
ELH
U
L MO
f E
chre
c A
Exercice
2 Parcourir le tableau et afficher pour chacun soit le numero s’il est personne, soit le
salaire s’il est enseignant ou soit le niveau s’il est étudiant.
I c
ELH
U
MO
Pour parcourir un tableau, on peut faire
from personne import Personne
f E L
hre
from etudiant import Etudiant
c
from enseignant import Enseignant
c A
p = Personne(100, ’wick’, ’john’)
etudiant = Etudiant(200, ’maggio’, ’toni’, "licence")
enseignant = Enseignant(300, ’dalton’, ’jack’, 1700)
Python
Solution
I c
for elt in list:
if isinstance(elt, Etudiant): ELH
U
print([Link])
L MO
elif isinstance(elt, Enseignant):
f E
print([Link])
chre
else:
c A
print([Link])
Python
Particularité du Python
I c
Héritage multiple : une classe peut hériterE
H
L ément de
simultan
U
plusieurs autres
L MO
r e
L’héritage multiple est
h f E é par certains langages comme
autoris
Python, C++...c
c A
c
def __init__(self, num: int = 0, nom: str = ’’, prenom: str = ’’,
I
ELH
salaire: int = 0, niveau: str = ’’, annee: str = ’’):
Enseignant.__init__(self, num, nom, prenom, salaire)
U
Etudiant.__init__(self, num, nom, prenom, niveau)
self.__annee = annee
L MO
f E
hre
@property
def annee(self) -> str:
c
c A
return self.__annee
@[Link]
def annee(self, annee) -> None:
self.__annee = annee
Python
c h r e
# affichec A
print(doctorant)
300 austin cooper 1700 doctorat 1 ère anné
e
Python
Surcharge (overload)
Python
Redéfinition (override)
Définir une méthode dans une classe qui est déjà définie dans la classe mère
I
c
Deux manières de redéfinir une méthode
H
ELla classe fille différente
Proposer une nouvelle implémentation
et indépendante de celle de laM
U dans
O mère (simple comme si on
classe
L
f Eimplémentation qui fait référence à celle de
définit une nouvelle méthode)
Proposer uneh
c r e
nouvelle
la classeA
c mère
Python
Redéfinition (override)
Définir une méthode dans une classe qui est déjà définie dans la classe mère
I
c
Deux manières de redéfinir une méthode
H
ELla classe fille différente
Proposer une nouvelle implémentation
et indépendante de celle de laM
U dans
O mère (simple comme si on
classe
L
f Eimplémentation qui fait référence à celle de
définit une nouvelle méthode)
Proposer uneh
c r e
nouvelle
la classeA
c mère
Exemple
I c
ELH
U
L MO
f E
chre
c A
U
L MO
f E
chre
c A
U
L MO
Testons tout cela dans le main)
f E
from personne import Personne
chre
c A
from etudiant import Etudiant
p = Personne(100, ’wick’, ’john’)
p.afficher_details()
# affiche john wick
Python
Python
Python
Python
Classe abstraite
hérite de la classe ABC (Abstract Base Class) du module abc
c
ne peut être instanciée si elle contient une ou plusieurs méthodes
I
abstraites
ELH
U
L MO
f E
c hre
c A
Python
Classe abstraite
hérite de la classe ABC (Abstract Base Class) du module abc
c
ne peut être instanciée si elle contient une ou plusieurs méthodes
I
abstraites
ELH
U
L MO
e f E
Si on déclare la classerPersonne
c
A ABCh abstraite
from abc
cimport
class Personne(ABC):
# code précédent
Python
Méthode abstraite
Une méthode abstraite doit être déclarée dans une classe abstraite
I c
H
Une méthode abstraite doit être implémentée par les classes filles de la classe abstraite
EL
U
L MO
f E
c hre
c A
Python
Méthode abstraite
Une méthode abstraite doit être déclarée dans une classe abstraite
I c
H
Une méthode abstraite doit être implémentée par les classes filles de la classe abstraite
EL
U
L MO
f E
hre
Déclarons la méthode afficherDetails() comme abstraite dans Personne
c
c A
@abstractmethod
def afficher_details(self):
pass
Python
Méthode abstraite
Une méthode abstraite doit être déclarée dans une classe abstraite
I c
H
Une méthode abstraite doit être implémentée par les classes filles de la classe abstraite
EL
U
L MO
f E
hre
Déclarons la méthode afficherDetails() comme abstraite dans Personne
c
c A
@abstractmethod
def afficher_details(self):
pass
Python
Python
I c
Définition
H
EL l’accès à un
Concept utilisé en programmation pourU
MO
faciliter
tableau d’objet défini dans unL objet.
funeE”classe” comme un tableau.
c h r e
(Autrement dit) Utiliser
c A
Python
Python
Python
A c
def __getitem__(self, i):
c
return self.__personnes[i]
Python
Dans [Link]
from listepersonnes import ListePersonnes
I c
from personne import Personne
EL H
O U
M
p = Personne(100, ’wick’, ’john’)
L
r e f E
p2 = Personne(101, ’dalton’, ’jack’)
c h
mes_amis = ListePersonnes([p, p2])
c A
print(mes_amis[0])
# affiche 100 john wick
Python
Python
Dans [Link]
from listepersonnes import ListePersonnes
from personne import Personne
I c
EL H
O
p = Personne(100, ’wick’, ’john’)U
L M’jack’)
fE
p2 = Personne(101, ’dalton’,
mes_amis[1] A c h r e
mes_amis = ListePersonnes([p,
= Personne(102,
p2])
’hadad’, ’karim’)
c
print(mes_amis[1])
# affiche 102 karim hadad
Python
def __len__(self):
return len(self.__personnes)
Python
Dans [Link]
from listepersonnes import ListePersonnes
I c
from personne import Personne
EL H
O U
M
p = Personne(100, ’wick’, ’john’)
L
r e f E
p2 = Personne(101, ’dalton’, ’jack’)
c h
mes_amis = ListePersonnes([p, p2])
c A
print(len(mes_amis))
# affiche 2
Python
Exercice
I
c
Dans Personne, définir un indexeur sur les
H
ELadresses
U
L
Dans le Main, vérifier qu’il est MO d’accéder à l’adresse
possible
r e fE
d’une personne de ListePersonnes
h
en faisant par exemple
c
c A
mes amis[0][0]
Python
Itérateur ?
Concept utilisé dans plusieurs langages de programmation
I c
comme C++ et Java
EL H
U
OPython itérables comme les
M
Objet utilisé pour itérer sur des objets
L
f E les ensembles et les chaı̂nes
listes, les tuples, les dictionnaires,
de caractères hre
A c
c
Initialis
é avec la méthode iter ()
Utilisant la méthode next () pour récupérer l’élément suivant
Python
Python
Python
Déclarons l’itérateur
iterateur = iter(liste)
I c
ELH
U
L MO
f E
chre
c A
Python
Déclarons l’itérateur
iterateur = iter(liste)
I c
Pour demander la première valeur ELH
OU
print(iterateur.__next__())M
fE L
# affiche 2
c h r e
c A
Python
Déclarons l’itérateur
iterateur = iter(liste)
I c
Pour demander la première valeur ELH
OU
print(iterateur.__next__())M
fE L
# affiche 2
c h r e
c A
Ou en plus simple
print(next(iterateur))
# affiche 5
Python
Utilisons une boucle while pour itérer sur tous les éléments de la liste
while True:
print(next(iterateur))
# affiche
# 2
I c
# 3
ELH
# 8
U
# 5
L MO
# Traceback (most recent call last):
f E
#
hre
File "C:/Users/elmou/PycharmProjects/cours-poo/main.
c
c A
py", line 6, in <module>
#
print(next(iterateur))
# StopIteration
Python
Utilisons une boucle while pour itérer sur tous les éléments de la liste
while True:
print(next(iterateur))
# affiche
# 2
I c
# 3
ELH
# 8
U
# 5
L MO
# Traceback (most recent call last):
f E
#
hre
File "C:/Users/elmou/PycharmProjects/cours-poo/main.
c
c A
py", line 6, in <module>
#
print(next(iterateur))
# StopIteration
Python
Python
f E L
hre
def __next__(self):
c
c A
if [Link] <= 20:
x = [Link]
[Link] += 1
return x
else:
raise StopIteration
Python
f E L
hre
for val in iter:
c
c A
print(val, end=" ")
# affiche 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
18 19 20
Python
I c
Pour la suite EL H
U
()O
Commentez la méthode getitem M
E L dans ListePersonnes.
c h ref
c A
Python
Et si on veut parcourir les objets Personne de la classe
ListePersonnes comme si c’était une vraie liste, c’est-à-dire :
from listepersonnes import ListePersonnes
from personne import Personne
I c
ELH
U
p = Personne(100, ’wick’, ’john’)
O
L M’jack’)
p2 = Personne(101, ’dalton’,
h r e fE
mes_amis = ListePersonnes([p, p2])
A c
c
for personne in mes_amis:
print(personne)
Python
I c
Exercice
E LH
U
O () dans
M
Ajoutez les méthodes iter () et next
L
ListePersonnes pour qu’elle
r e f Esoit itérable.
A ch
c
Python
Solution
class ListePersonnes:
def __init__(self, personnes: list) -> None:
self.__personnes = personnes
I c
self.__indice = 0
ELH
U
def __iter__(self):
return self
L MO
re f E
c h
def __next__(self):
A
ifcself.__indice
raise >= len(self.__personnes):
StopIteration
else:
value = self.__personnes[self.__indice]
self.__indice += 1
return value
Python
Définition
I
c
H
ELC++ (surcharge
U
Concept introduit initialement par le langage
d’opérateurs)
L MO
r e
Permettant de surcharger
h f Eles opérateurs de comparaison ou les
A c étiques déjà utilisés pour les types prédéfinis
opérateurs arithm
c
Python
Python
Python
Exemple
f E L
chre
c A
Python
Exemple
f E L
chre
Remarques c A
Les deux objets précédents ne sont pas égaux car ils occupent deux espaces mémoires
différents
Pour définir une nouvelle règle de comparaison d’objets, on doit implémenter la méthode
eq () dans la classe Personne
Python
Ajoutons l’implémentation de la méthode eq () dans la classe Personne
I c
ELH
U
L MO
f E
chre
c A
Python
Ajoutons l’implémentation de la méthode eq () dans la classe Personne
I c
E LH
En testant le main précédent, le résultat est OU
L M
from personne import Personne
r ef E
c h
c A ’wick’,
p = Personne(100,
p2 = Personne(100,
’john’)
’wick’, ’john’)
if p == p2:
print(True)
else:
print(False)
# affiche True
Python
I c
H
Ajoutons l’implémentation de la méthode gt () dans la classe
EL
Personne
U
L MO
def __gt__(self, other: "Personne"):
return self._num f>E
c h r e other._num
c A
Python
testons cela dans le main
if p > p2:
print(True)
else:
print(False)
# affiche False
Python
Ajoutons l’implémentation de la méthode add () dans la classe Enseignant
I c
ELH
U
L MO
f E
chre
c A
Python
Ajoutons l’implémentation de la méthode add () dans la classe Enseignant
I c
ELH
U
testons cela dans [Link]
L MO
f E
hre
from enseignant import Enseignant
c
c A
enseignant = Enseignant(300, ’dalton’, ’jack’, 1700)
print(enseignant)
# affiche 300 jack dalton 1700
print(enseignant + 200)
# affiche 300 jack dalton 1900
Python
I
c
Généricité
L H
ETypeScript,
O
Concept connu dans plusieurs LOO (Java, U C#)
M
L classes s’adaptant avec plusieurs
f E
Objectif : définir des fonctions,
re
types de données
c h
c A
Python
Exemple
I c
si on a besoin d’une classe dont les méthodes effectuent les
mêmes opérations quel que soit le type d’attributs
EL H
somme pour entiers ou réels,
O U
L
concaténation pour chaı̂nes M
de caractères,
e
ou logique pourrbool
E
f éens...
A c h
...
c
Impossible sans définir plusieurs classes (une pour chaque
type)
Python
Solution avec la généricité
T = TypeVar(’T’)
I c
class Operation (Generic[T]):
ELH
def __init__(self, var1: T, var2: T):
U
self.__var1 = var1
L MO
self.__var2 = var2
f E
def plus(self):
c hre
c A
if type(self.__var1) is str :
return self.__var1 + self.__var2
elif type(self.__var1) is int and type(self.__var2) is int:
return self.__var1 + self.__var2;
elif type(self.__var1) is bool and type(self.__var2) is bool:
return self.__var1 | self.__var2
else:
raise TypeError("error")
Python
Nous pouvons donc utiliser la même méthode pour plusieurs types différents
from operation import Operation
try:
operation1 = Operation[int](5, 3)
print([Link]())
I c
# affiche 8
ELH
U
MO
operation2 = Operation[str]("bon", "jour")
print([Link]())
# affiche bonjour
f E L
chre
operation3 = Operation[bool](True, False)
c A
print([Link]())
# affiche true
except TypeError:
print ("problème de type")
Python
Énumération
est un ensemble de noms liés à des valeurs constantes et
uniques (nom + valeur = membre)
I c
est itérable ELH
U
L MO
f E
chre
c A
Python
Énumération
est un ensemble de noms liés à des valeurs constantes et
uniques (nom + valeur = membre)
I c
est itérable ELH
U
L MO
f E
A c hre
Exemple : définissons l’énumération Animal
c
from enum import Enum
Python
print ([Link])
# affiche 2
I c
print ([Link])
# affiche chien
ELH
U
L MO
f E
chre
c A
Python
print ([Link])
# affiche 2
I c
print ([Link])
# affiche chien
ELH
U
L MO
f E
e deux écritures suivantes sont équivalentes
Pour récupérer un membre,rles
c h
c A
print ([Link])
# affiche [Link]
print (Animal[’CHIEN’])
# affiche [Link]
Python
Python
Python
Pour modifier les valeurs par défaut associées aux noms, on déclare
l’énumération comme une classe qui hérite de Enum
I c
class Animal(Enum):
CHAT = 1
ELH
U
MO
CHIEN = 3
CHAMEAU = 2
CHEVAL = 4
f E L
SOURIS = 6
chre
c A
Python
Pour modifier les valeurs par défaut associées aux noms, on déclare
l’énumération comme une classe qui hérite de Enum
I c
class Animal(Enum):
CHAT = 1
ELH
U
MO
CHIEN = 3
CHAMEAU = 2
CHEVAL = 4
f E L
SOURIS = 6
chre
c A
Pour récupérer la valeur associée à un nom (rien ne change)
print([Link])
# affiche 2
Python
class Animal(Enum):
I c
CHAT = 1
CHIEN = 3
ELH
U
MO
CHAMEAU = 2
CHEVAL = 2
SOURIS = 6
f E L
chre
c A
Python
class Animal(Enum):
I c
CHAT = 1
CHIEN = 3
ELH
U
MO
CHAMEAU = 2
CHEVAL = 2
SOURIS = 6
f E L
A c hre
c
En accédant via une valeur, on récupère le premier membre ayant la valeur
recherchée
print(Animal(2))
# affiche [Link]
Python
Python
I c
class Animal(Enum):
CHAT = auto() ELH
U
CHIEN = auto()
L MO
CHAMEAU = auto()
f E
CHEVAL = auto()
chre
c A
SOURIS = auto()
for animal in Animal:
print([Link])
# affiche 1 2 3 4 5
Python
Fonction dir()
I
c
sans paramètre : retourne la liste de méthodesE H
L et attributs
U
disponibles dans le module
L MO
avec paramètre (objet ou
h
attributs définisc(et
efés)E
rhérit classe) : retourne la liste de méthodes et
de la classe
c A
Python
print(dir())
# affiche [’__annotations__’, ’__builtins__’, ’__cached__’, ’
c
__doc__’, ’__file__’, ’__loader__’, ’__name__’, ’__package__
I
’, ’__spec__’]
E L H
U
print(dir(personne))
L MO ’__dict__’, ’__dir__’, ’
f E ’__hash__’,
# affiche [’__class__’, ’__delattr__’,
h r e
__doc__’, ’__eq__’, ’__format__’, ’__ge__’, ’
c ’__le__’, ’__lt__’, ’__module__’,
__getattribute__’, ’__gt__’, ’__init__’, ’
A
c’__new__’, ’__reduce__’, ’__reduce_ex__’, ’__repr__
__init_subclass__’,
__ne__’,
’
Python
Conventions
Une classe par fichier
I
c
H
EL d’une classe
U
Deux lignes vides avant et après la déclaration
O
LlaM
f E pour chaque méthode publique à
Une ligne vide avant et après déclaration d’une méthode
Un message de h r e
cla ligne contenant le mot-clé def
documentation
c
à placer aprA
ès
Une classe de test par classe