Construction d'une classe
Les espaces de nom
Le polymorphisme
Héritage
Programmation Orientée Objet avec
Python
Enseignant:
Austin Wao
Novembre 2024 - wkaustins@[Link]
Austin Wao
Construction d'une classe
Les espaces de nom
Le polymorphisme
Héritage
Structure
Structure :
Construction d'une classe
Espaces de noms
Polymorphisme
Héritage
Accès et modications des attributs depuis l'extérieur
Austin Wao
Construction d'une classe
Les espaces de nom
Le polymorphisme
Héritage
La classe minimale
Dénition
En Python, le mot-clé class permet de créer sa propre classe,
suivi du nom de cette classe. Ce nom doit commencer toujours
par une majuscule. Par exemple :
>>> class Citron :
...................... pass
Austin Wao
Construction d'une classe
Les espaces de nom
Le polymorphisme
Héritage
La classe minimale
Dénition
En Python, le mot-clé class permet de créer sa propre classe,
suivi du nom de cette classe. Ce nom doit commencer toujours
par une majuscule. Par exemple :
>>> class Citron :
...................... pass
>>> citron1 = Citron() (création d'une une instance )
Austin Wao
Construction d'une classe
Les espaces de nom
Le polymorphisme
Héritage
Ajout d'un attribut d'instance
Reprenons notre classe Citron et l'instance citron1 créée
précédemment. Regardons les attributs et méthodes que cet
objet possède, puis tentons de lui ajouter un attribut :
>>> print(dir ( citron1 ))
[′ __class __′ ,′ __dict __′ , [...],′ __weakref __′ ]
L'objet possède de nombreuses méthodes ou attributs qui
commencent et qui se terminent par deux caractères
underscores.
les underscores indiquent qu'il s'agit de méthodes ou
attributs destinés au fonctionnement interne de l'objet
Austin Wao
Construction d'une classe
Les espaces de nom
Le polymorphisme
Héritage
Ajout d'un attribut d'instance
>>> [Link] = " jaune "
>>> print(dir(citron1))
[′ __class __′ ,′ __dict __′ , [...],′ __weakref __′ ,′ couleur ′ ]
Austin Wao
Construction d'une classe
Les espaces de nom
Le polymorphisme
Héritage
Ajout d'un attribut d'instance
>>> [Link] = " jaune "
>>> print(dir(citron1))
[′ __class __′ ,′ __dict __′ , [...],′ __weakref __′ ,′ couleur ′ ]
La notation [Link] donne accès à l'attribut de
l'objet
L'attribut nommé .__dict__ est particulièrement
intéressant. Il s'agit d'un dictionnaire qui listera les
attributs créés dynamiquement dans l'instance en cours
Austin Wao
Construction d'une classe
Les espaces de nom
Le polymorphisme
Héritage
Ajout d'un attribut d'instance
>>> citron1 = Citron ()
>>> print(citron1.__dict__)
Austin Wao
Construction d'une classe
Les espaces de nom
Le polymorphisme
Héritage
Ajout d'un attribut d'instance
>>> citron1 = Citron ()
>>> print(citron1.__dict__)
{}
>>> [Link] = " jaune "
>>> print(citron1.__dict__)
Austin Wao
Construction d'une classe
Les espaces de nom
Le polymorphisme
Héritage
Ajout d'un attribut d'instance
>>> citron1 = Citron ()
>>> print(citron1.__dict__)
{}
>>> [Link] = " jaune "
>>> print(citron1.__dict__)
{'couleur' : 'jaune '}
L'ajout d'un attribut depuis l'extérieur de la classe (on parle
aussi du côté client ) avec une syntaxe
instance.nouvel_attribut = valeur, créera ce nouvel attribut
uniquement pour cette instance.
Austin Wao
Construction d'une classe
Les espaces de nom
Le polymorphisme
Héritage
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 :
>>> class Citron :
couleur="jaune"
>>> citron1 = Citron()
>>> print([Link])
>>> citron2 = Citron()
>>> print([Link])
Austin Wao
Construction d'une classe
Les espaces de nom
Le polymorphisme
Héritage
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 :
>>> class Citron :
couleur="jaune"
>>> citron1 = Citron()
>>> print([Link])
>>> citron2 = Citron()
>>> print([Link])
jaune
jaune
Austin Wao
Construction d'une classe
Les espaces de nom
Le polymorphisme
Héritage
Les méthodes
une méthode est une fonction :
>>> class Citron :
couleur="jaune"
def coucou(self) :
print("Bonjour à tous")
>>> citron1 = Citron()
>>> [Link]()
Austin Wao
Construction d'une classe
Les espaces de nom
Le polymorphisme
Héritage
Les méthodes
une méthode est une fonction :
>>> class Citron :
couleur="jaune"
def coucou(self) :
print("Bonjour à tous")
>>> citron1 = Citron()
>>> [Link]()
Bonjour à tous
Austin Wao
Construction d'une classe
Les espaces de nom
Le polymorphisme
Héritage
Les méthodes
une méthode étant une fonction, elle peut aussi retourner une
valeur :
>>> class Citron :
couleur="jaune"
def recupererSaveur(self) :
return "acide"
>>> citron1 = Citron()
>>> saveur = [Link]()
>>> print(saveur)
Austin Wao
Construction d'une classe
Les espaces de nom
Le polymorphisme
Héritage
Les méthodes
une méthode étant une fonction, elle peut aussi retourner une
valeur :
>>> class Citron :
couleur="jaune"
def recupererSaveur(self) :
return "acide"
>>> citron1 = Citron()
>>> saveur = [Link]()
>>> print(saveur)
acide
Austin Wao
Construction d'une classe
Les espaces de nom
Le polymorphisme
Héritage
Le constructeur
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
elle sert au fonctionnement interne de notre classe, et sauf
cas extrêmement rare, elle n'est pas supposée être lancée
comme une fonction classique par l'utilisateur de la classe
Ce constructeur est exécuté à chaque instanciation de
notre classe, et ne renvoie pas de valeur, il ne possède
donc pas de return.
Austin Wao
Construction d'une classe
Les espaces de nom
Le polymorphisme
Héritage
Le constructeur
Dans la mesure du possible, nous vous conseillons de
créer tous les attributs d'instance dont vous aurez besoin
dans le constructeur .__init __() plutôt que dans toute
autre méthode. Ainsi ils seront visibles dans toute la
classe dès l'instanciation.
Exemple :
class Citron :
def __init__(self, masse, couleur, saveur) :
[Link]=masse
[Link]=couleur
[Link]=saveur
citron1 = Citron(20,"verte","Acide")
print([Link])
Austin Wao
Construction d'une classe
Les espaces de nom
Le polymorphisme
Héritage
Le constructeur
Dans la mesure du possible, nous vous conseillons de
créer tous les attributs d'instance dont vous aurez besoin
dans le constructeur .__init __() plutôt que dans toute
autre méthode. Ainsi ils seront visibles dans toute la
classe dès l'instanciation.
Exemple :
class Citron :
def __init__(self, masse, couleur, saveur) :
[Link]=masse
[Link]=couleur
[Link]=saveur
citron1 = Citron(20,"verte","Acide")
print([Link])
verte
Austin Wao
Construction d'une classe
Les espaces de nom
Le polymorphisme
Héritage
Les accesseurs et seteurs
l'accès et la modication des attributs d'une instance
d'une classe doit se fait à travers des méthodes
des méthodes permettant de d'accéder (accesseurs) et de
modier (seteurs) ces attributs
ces méthodes ont généralement pour initial get (respset)
suivi du nom de la variable
Exemple :
class Citron :
def setMasse(self, masse) :
[Link]=masse
def getMasse(self) :
return [Link]
citron1 = Citron(20,"verte","Acide")
print([Link]())
Austin Wao
Construction d'une classe
Les espaces de nom
Le polymorphisme
Héritage
Les accesseurs et seteurs
l'accès et la modication des attributs d'une instance
d'une classe doit se fait à travers des méthodes
des méthodes permettant de d'accéder (accesseurs) et de
modier (seteurs) ces attributs
ces méthodes ont généralement pour initial get (respset)
suivi du nom de la variable
Exemple :
class Citron :
def setMasse(self, masse) :
[Link]=masse
def getMasse(self) :
return [Link]
citron1 = Citron(20,"verte","Acide")
print([Link]())
20 Austin Wao
Construction d'une classe
Les espaces de nom
Le polymorphisme
Héritage
Les accesseurs et seteurs
Exemple(suite) :
[Link](50)
print([Link]())
Austin Wao
Construction d'une classe
Les espaces de nom
Le polymorphisme
Héritage
Les accesseurs et seteurs
Exemple(suite) :
[Link](50)
print([Link]())
50
Application : Gestion des élèves
Créer une classe Eleve contenant les attributs : Nom,
prenom, age, moyenne
Créer les accesseurs et les seteurs respectifs
Ecrire un script qui demande à un utilisateur d'entrer les
informations de 5 élèves. Les informations d'un élève sont
stockées dans une instance de la classe Eleve. Toutes les
instances sont stockées dans une liste
écrire un script qui détermine et ache le nom et prénom
de l'élève le plus âgé
ecrire un scriptAustinquiWao
augmente de +2 la moyenne de
Construction d'une classe
Les espaces de nom
Le polymorphisme
Héritage
Espace de noms
Dénition
un espace de noms est déni comme suit : a namespace
is a mapping from names to objects
Un espace de noms est une correspondance entre des
noms et des objets
Un espace de noms peut être vu aussi comme une capsule
dans laquelle on trouve des noms d'objets.
Par exemple, le programme principal ou une fonction
représentent chacun un espace de noms
Austin Wao
Construction d'une classe
Les espaces de nom
Le polymorphisme
Héritage
Espace de noms
Austin Wao
Construction d'une classe
Les espaces de nom
Le polymorphisme
Héritage
Espace de noms
Austin Wao
Construction d'une classe
Les espaces de nom
Le polymorphisme
Héritage
Espace de noms
Austin Wao
Construction d'une classe
Les espaces de nom
Le polymorphisme
Héritage
Espace de noms
Austin Wao
Construction d'une classe
Les espaces de nom
Le polymorphisme
Héritage
Le polymorphisme
Dans la vie, celui-ci évoque la capacité à prendre plusieurs
apparences, qu'en est-il en programmation ?
En programmation, le polymorphisme est la capacité
d'une fonction (ou méthode) à se comporter
diéremment en fonction de l'objet qui lui est passé. Une
fonction donnée peut donc avoir plusieurs dénitions.
Un exemple concret de polymorphisme : la fonction
Python sorted() va trier par ordre ASCII si l'argument est
une chaîne de caractères, et elle va trier par ordre
croissant lorsque l'argument est une liste d'entiers
sorted (" citron ")
[′ c ′ ,′ i ′ ,′ n′ ,′ o ′ ,′ r ′ ,′ t ′ ]
sorted ([1 , -67, 42, 0, 81])
[−67, 0, 1, 42, 81]
Application : Gestion des élèves
Austin Wao
Construction d'une classe
Les espaces de nom
Le polymorphisme
Héritage
Dénition
Dénition
En programmation, l'héritage est la capacité d'une classe
d'hériter des propriétés d'une classe pré-existante. On
parle de classe mère et de classe lle. En Python,
l'héritage peut être multiple lorsqu'une classe lle hérite
de plusieurs classes mères
En Python, lorsque l'on veut créer une classe héritant
d'une autre classe, on ajoutera après le nom de la classe
lle le nom de la ou des classe(s) mère(s) entre
parenthèses
Austin Wao
Construction d'une classe
Les espaces de nom
Le polymorphisme
Héritage
Exemple
Dans l'exemple suivant, la classe Fille1 hérite de la classe
Mere1 et la classe Fille2 hérite des deux classes Mere1 et
[Link] le cas de la classe Fille2, on parle d'héritage
multiple
Austin Wao
Construction d'une classe
Les espaces de nom
Le polymorphisme
Héritage
Exemple
Un salut de la classe lle !
Austin Wao
Construction d'une classe
Les espaces de nom
Le polymorphisme
Héritage
Exemple d'application
Nous allons maintenant prendre un exemple un peu plus
conséquent pour illustrer la puissance de l'héritage en
programmation
D'abord quelques mots à propos de la conception.
Imaginons que nous souhaitions créer plusieurs classes
correspondant à nos fruits favoris ! par exemple le citron
(comme par hasard !), l'orange, le kaki, etc
Chaque fruit a ses propres particularités, mais il y a aussi
de nombreux points communs.
Nous pourrions donc concevoir une classe Fruit
permettant, par exemple, d'instancier un fruit et ajouter
des méthodes d'achage commune à n'importe quel fruit
Austin Wao
Construction d'une classe
Les espaces de nom
Le polymorphisme
Héritage
Exemple d'application
et ajouter (ou toute autre méthode) pouvant être utilisée
pour n'importe quel fruit
Nous pourrions alors créer des classes comme Citron,
Orange, etc., héritant de la classe Fruit et ainsi nous
économiser des lignes de code identiques à ajouter pour
chaque fruit
Austin Wao
Construction d'une classe
Les espaces de nom
Le polymorphisme
Héritage
Exemple d'application
Austin Wao
Construction d'une classe
Les espaces de nom
Le polymorphisme
Héritage
Exemple d'application
Austin Wao
Construction d'une classe
Les espaces de nom
Le polymorphisme
Héritage
Travaux Dirigés
Task1
Récupérer le script [Link] qui implémente la classe
Rectangle. Complétez le programme principal pour que le
script :
Classe Rectangle
crée une instance rectangle de la classe Rectangle ;
ache les attributs d'instance largeur, longueur et coul ;
calcule et ache la surface de rectangle ;
ache une ligne vide ;
change le rectangle en carré de 30 m de côté ;
calcule et ache la surface de ce carré ;
crée une autre instance rectangle2 aux dimensions et à la
couleur que vous souhaitez et qui ache les attributs et
la surface de Austin
ce nouveau
Wao
rectangle
Construction d'une classe
Les espaces de nom
Le polymorphisme
Héritage
Travaux Dirigés
Exercice 1 : Classe Rectangle améliorée
Entraînez-vous avec la classe Rectangle. Créez la méthode
calcule_perimetre() qui calcule le périmètre d'un objet
rectangle. Testez sur un exemple simple (largeur = 10 m,
longueur = 20 m).
Exercice2 : Classe Pylône
Créez une nouvelle classe Pylone avec les attributs x, y, z (qui
contiennent les coordonnées cartésiennes) et la méthode
calcul_distance() qui calcule la distance entre deux pylônes.
Testez cette classe sur plusieurs exemples
Austin Wao
Construction d'une classe
Les espaces de nom
Le polymorphisme
Héritage
Travaux Dirigés
Exercice 3 : Classe Rectangle améliorée
Dénissez une classe Cercle(). Les objets construits à partir de
cette classe seront des cercles de tailles variées. En plus de la
méthode constructeur (qui utilisera donc un paramètre rayon),
vous dénirez une méthode surface(), qui devra renvoyer la
surface du cercle. Dénissez ensuite une classe Cylindre()
dérivée de la précédente. Le constructeur de cette nouvelle
classe comportera les deux paramètres rayon et hauteur. Vous
y ajouterez une méthode volume() qui devra renvoyer le
volume du cylindre (rappel : volume d'un cylindre = surface de
section x hauteur).
Austin Wao
Construction d'une classe
Les espaces de nom
Le polymorphisme
Héritage
Travaux Dirigés
Exercice 4 : Classe Rectangle améliorée
Complétez l'exercice précédent en lui ajoutant encore une
classe Cone(), qui devra dériver cette fois de la classe
Cylindre(), et dont le constructeur comportera lui aussi les
deux paramètres rayon et hauteur. Cette nouvelle classe
possédera sa propre méthode volume(), laquelle devra renvoyer
le volume du cône (rappel : volume d'un cône = volume du
cylindre correspondant divisé par 3).
Austin Wao
Construction d'une classe
Les espaces de nom
Le polymorphisme
Héritage
Travaux Dirigés
Exercice 5 : Classe Domino
Dénissez une classe Domino() qui permette d'instancier des
objets simulant les pièces d'un jeu de dominos. Le
constructeur de cette classe initialisera les valeurs des points
présents sur les deux faces A et B du domino (valeurs par
défaut = 0). Deux autres méthodes seront dénies :
une méthode affiche _points() qui ache les points
présents sur les deux faces
une méthode valeur() qui renvoie la somme des points
présents sur les 2 faces
.
Austin Wao
Construction d'une classe
Les espaces de nom
Le polymorphisme
Héritage
Travaux Dirigés
Exercice 6 : Classe CompteBancaire
Dénissez une classe CompteBancaire(), qui permette
d'instancier des objets tels que compte1, compte2, etc. Le
constructeur de cette classe initialisera deux attributs
d'instance nom et solde, avec les valeurs par défaut 'Ngono' et
1000. Trois autres méthodes seront dénies :
depot(somme) permettra d'ajouter une certaine somme
au solde ;
retrait(somme) permettra de retirer une certaine
somme du solde ;
ache() permettra d'acher le nom du titulaire et le
solde de son compte
. Austin Wao