Ricco Rakotomalala
[Link]
R.R. – Université Ly on 2 1
AVERTISSEMENT
Python intègre des particularités – pour ne pas dire bizarreries –
que l’on ne retrouve pas dans les langages objets populaires (C+
+, Java, C#). Ex. création à la volée d’une propriété sur un objet
(instance de classe), possibilité de l’utiliser dans les méthodes
(alors qu’elle n’apparaît nulle part dans la définition de la classe).
Ce n’est pas gérable dans une démarche pédagogique sur
plusieurs années (cours Java en M1, C# en M2 au département
DIS).
Par conséquent, pour forger les bonnes habitudes, ce support
adopte la présentation la plus conventionnelle possible par
rapport aux autres langages précités, quitte à passer sous silence
R.R. –certaines
Université Ly on 2possibilités de Python. 2
Elaboration et instanciation
LES CLASSES S O U S PYTHON
R.R. – Université Ly on 2 3
Classes ?
Une classe est un type permettant de regrouper dans la même structure :
- les informations (champs, propriétés, attributs) relatives à une entité ;
- les procédures et fonctions permettant de les manipuler (méthodes).
Champs et méthodes constituent les membres de la classe.
Remarques :
• La classe est un type structuré qui va plus loin que l’enregistrement (ce dernier
n’intègre que les champs)
• Les champs d’une classe peuvent être de type quelconque
• Ils peuvent faire référence à d’instances d’autres classes
R.R. – Université Ly on 2 4
Classes ?
Termes techniques :
• « Classe » est la structure ;
• « Objet » est une instance de la classe (variable obtenue après instanciation) ;
• « Instanciation » correspond à la création d’un objet
• L’objet est une référence (traité par le ramasse-miettes, destruction explicite
inutile)
R.R. – Université Ly on 2 5
Définition et implémentation d’une classe
Ce n’est pas obligatoire, mais on a •class est un mot clé permettant de définir la
toujours intérêt à définir les classes structure
dans des modules. On peut avoir •Personne est le nom de la classe ici
plusieurs classes dans un module. •"""Classe Personne""" sert à documenter la classes
•Regarder le rôle des « : » et des indentations
Ex. [Link]
• init est une méthode standard appelée
constructeur, automatiquement appelée lors
#début définition
de l’instanciation
class Personne:
•self représente l’instance elle-même, elle doit
"""Classe Personne"""
apparaître en première position dans la définition
#constructeur de toutes les méthodes, mais il ne sera pas
def init (self): nécessaire de la spécifier lors de l’appel
#lister les champs •nous exploitons le constructeur pour énumérer les
[Link] = "" champs de la classe (pas obligatoire, mais
[Link] = 0 bonne habitude à prendre), ils sont non typés
[Link] = 0.0 •le constructeur peut prendre des paramètres en
#fin constructeur
entrée. Ex. initialisation des champs
•contrairement aux autres langages, un seul
#fin définition
constructeur par classe seulement
•noter le rôle du « . » dans l’accès aux
R.R. – Université Ly on 2 champs 6
Instanciation et utilisation dans le programme principal
•Il faut d’abord importer le module cotenant la
# -*- coding: utf -*-
classe, nous lui attribuons l’alias MP ici
#appel du module •Pour la création de l’instance p, nous spécifions
import ModulePersonne as MP le module puis le nom de la classe
•Il y a () parce que c’est bien une méthode que
#instanciation nous appelons à la création : le constructeur
p = [Link]() •Le paramètre self du constructeur n’est pas à
spécifier sur l’instance
#affiche tous les membres de p •Noter le rôle de « . » lors de l’accès aux
print(dir(p)) champs de l’instance
#affectation aux champs [Link] •Les champs sont accessibles en lecture /
= input("Nom : ") écriture
[Link] = int(input("Age : ")) •L’accès direct aux champs n’est pas conseillé en
[Link] = float(input("Salaire : programmation objet, mais on fera avec cette
")) année (sous Python, pour rendre un attribut
#affichage privé, il faut mettre un double _ devant le nom
print([Link],", ",[Link],", ",[Link]) du champ et créer alors des accesseurs et des
mutateurs, à voir en M1)
R.R. – Université Ly on 2 7
#début définition Programmer des méthodes supplémentaires
class Personne: """Classe Personne"""
Nous avons implémenté 2 méthodes
supplémentaires dans la classe.
#constructeur
Le programme principal s’en trouve grandement
def init (self):
simplifié.
#lister les champs
[Link] = ""
[Link] = 0
[Link] = 0.0 # -*- coding: utf -*-
#fin constructeur
#saisie des infos #appel du module
def saisie(self): import ModulePersonne as MP
[Link] = input("Nom : ")
[Link] = int(input("Age : ")) #instanciation
[Link] = float(input("Salaire : ")) p = [Link]()
#fin saisie
#affichage des infos
#saisie
def affichage(self): [Link]()
print("Son nom est ", [Link]) print("Son âge : ",
[Link]) #méthode affichage
print("Son salaire : ", [Link]) [Link]()
#fin affichage
Remarque : Noter le comportement de
#fin définition
R.R. – Université Ly on 2
self 7
Programmer des méthodes paramétrées
Programme
Rajouter la méthode retraite() qui calcule le principal
nombre d’années avant l’âge limite de la # -*- coding: utf -*-
retraite. #appel du module
#début définition import ModulePersonne as MP
class Personne: #instanciation
"""Classe Personne""" p = [Link]()
#saisie
…
[Link]()
#reste avant retraite
#méthode affichage
def retraite(self, limite): [Link]()
reste = limite – int( [Link]) #reste avant retaite
if (reste < 0): [Link](62)
print("Vous êtes à la retraite")
else: Un
print("Il vous reste %s années" % (reste)) #fin retraite exemple
#fin définition
Saisie
Affichage
Retraite
R.R. – Université Ly on 2 9
Gérer une collection d’objets – L’exemple des listes
C O L L E C T I O N D’OBJETS
R.R. – Université Ly on 2 10
Gérer une collection d’objets
Python propose des outils pour la gestion
# -*- coding: utf -*- des collections d’objets hétérogènes (tuple,
liste, dictionnaire). Ils sont opérationnels
#appel du module pour les instances de nos classes.
import ModulePersonne as MP
#liste vide
liste = [] Exemple
d’exécution
#nb. de pers ?
n = int(input("Nb de pers : "))
#saisie liste
for i in range(0,n): Créer l’objet référencé par
a = [Link]() a, effectuer la saisie.
[Link]()
Ajouter la référence dans la
[Link](a)
liste.
#affichage
print("*** début affichage 1")
for p in liste: Le typage est automatique,
print("-------")
p est bien de type
[Link]()
Personne.
R.R. – Université Ly on 2 11
Accès indicé et modification des objets
Vérifier toujours que l’indice utilisé est
valide.
#accès par numéro Récupération de la référence de
numero = int(input("N° ind. à traiter :")) l’objet, indice = numéro
if (numero < len(liste)): Accès au champ salaire de
b = liste[numero] l’objet référencé par b.
[Link] = [Link] * 2
#affichage de nouveau
print("xxx début affichage 2") liste[numero].salaire =
… fonctionne
for p in liste:
également !
print("-------")
[Link]()
else:
print("indice non
valable")
Exemple
d’exécution
R.R. – Université Ly on 2 12
Collection d’objets - Commentaires
• Les collections de nos objets (instances de nos classes) ouvre la porte à
une programmation organisée et efficace
• Leur intérêt décuplera lorsque nous étudierons les fichiers
• Il est judicieux d’élaborer une classe dédiée à la gestion de la collection (où
la liste serait un champ de la classe)
• Les objets de la collection peuvent être différents. Quand ce sont des
instances
de classes héritières du même ancêtre, on parle de liste polymorphe
• Le gestionnaire de collection peut être un dictionnaire, le mécanisme « clé –
valeur » (« clé – objet » en l’occurrence pour nous) ouvre des possibilités
immenses (ce mécanisme est très en vogue, ex. bases NoSQL)
R.R. – Université Ly on 2 13
Héritage et surcharge des méthodes, variables de
classes
P L U S L O I N AV E C L E S C L A S S E S
R.R. – Université Ly on 2 14
Une fonction peut renvoyer un objet (instance de classe)
#début définition
class Personne: Une fonction peut
"""Classe
Personne""" renvoyer une instance de
… classe
#copie des
infos q est une nouvelle instance de la classe
def Personne
copie(self):
q = Personne()
[Link] = [Link] La fonction renvoie l’objet
[Link] = q
[Link]
[Link] =
#fin définition
[Link]
#instanciation
return q
p = [Link]()
#fin copie
#saisie
[Link]()
print(">> Affichage de p")
[Link]()
#copie
q = [Link]()
print(">> Affichage de q")
[Link]()
#comp. références
pareil = (p == q)
Le contenu des champs est le même
print("ref. identiques : %s" % (pareil)) mais ce sont 2 références
différentes.
R.R. – Université Ly on 2 15
Héritage
Idée : L’héritage permet de construire une hiérarchie de classes. Les
classes héritières héritent des champs et méthodes de la classe ancêtre.
Ce mécanisme nécessite des efforts de modélisation et de conception.
Mais au final, on améliore la lisibilité et la réutilisabilité du code.
Personne
nom
ag e
salaire
La classe Employe est une Personne,
saisie()
avec le champ supplémentaire prime.
affichage() Cela va nécessiter la reprogrammation
des méthodes saisie() et affichage().
On peut éventuellement ajouter
Employe d’autres méthodes spécifiques à
Employe.
prime
saisie() class en
Déclaration Employe(Personne):
Python
affichage()
…
R.R. – Université Ly on 2 16
Surcharge des méthodes
Surtout pas de copier/coller de code ! Noter
#classe Employé
comment sont réutilisées les méthodes
class Employe(Personne):
programmées dans la classe ancêtre Personne.
#constructeur Remarque : Noter l’utilisation de self dans ce
def init contexte.
(self):
Personne. init
(self) Le prog. principal ne présente aucune difficulté
[Link] = 0.0 # -*- coding: utf -*-
#fin constructeur
#appel du module
#saisie import ModulePersonne as MP
def saisie(self):
[Link](self) #instanciation
[Link] = float(input("Prime : ")) e = [Link]()
#fin saisie
#saisie
#affichage [Link]()
def affichage(self):
[Link](self) #affichag
print("Sa prime : ", [Link]) e
#fin affichage print(">> Affichage")
[Link]()
#fin classe Employé
R.R. – Université Ly on 2 17
Liste polymorphe
Idée : Une collection peut contenir des
# -*- coding: utf -*- objets
de type différent. Cette caractéristique
#appel du module
import ModulePersonne as MP prend un sens particulier quand les objets
#liste vide
liste = [] sont issus de la même lignée.
#nb. de pers ?
n = int(input("Nb de pers : "))
#instanciation Exemple
for i in range(0,n):
code = input("1 Personne, 2 Employé : ")
d’exécution
if (code == "1"):
m = [Link]()
else:
m = [Link]() Selon la classe
[Link](m)
#saisie liste réellement instanciée
print("*** début saisie")
for p in liste:
(Employe ou Personne),
print("-------") les méthodes saisie() et
[Link]()
#affichage affichage() adéquates
print(">>> début affichage") seront
for p in liste:
print("-------") appelées. C’est l’idée
[Link]()
du polymorphisme.
R.R. – Université Ly on 2 18
Variable de classes
Une variable de classe est un champ
#début définition
class Personne:
directement accessible sur la classe, et qui
"""Classe est partagée par toutes les instances de la
Personne""" classe.
#variable de classe # -*- coding: utf -*-
compteur = 0 #appel du module
import ModulePersonne
#constructeur as MP
def init (self): #print compteur 0
#lister les champs print([Link])
[Link] = "" #1ere instanciation
[Link] = 0 p = [Link]() 1
print([Link])
[Link] = 0.0
#2nde instanciation
[Link] += 1
q = [Link]() 2
#fin constructeur
print([Link])
...
#de nouveau compteur 2
#fin définition
print([Link]
#affectation
mpteur) 1
Noter que le champ est [Link] = 13
associé à la classe même print([Link]) 13
(Personne) et non pas à print([Link]) 13
print([Link]) 13
l’instance (self).
Attention. Les affectations ne sont pas #affectation 2
[Link] = 66
répercutées de la même manière selon print([Link]) 13
qu’on la réalise sur la classe ou sur une print([Link]) 66
instance. A manipuler avec prudence !!! print([Link]) 13
R.R. – Université Ly on 2 19
Références
De la documentation à profusion (n’achetez pas des livres sur Python)
Site du cours
[Link]
Site de Python
Welcome to Python - [Link]
Python 3.4.3 documentation - [Link]
Portail Python
Page Python de [Link]
Quelques cours en ligne
P. Fuchs, P. Poulain, « Cours de Python » sur [Link]
G. Swinnen, « Apprendre à programmer avec Python » sur
[Link]
« Python », Cours interactif sur Codecademy
POLLS (KDnuggets)
Data Mining / Analytics Tools Used
Python, 4ème en 2015
What languages you used for data mining / data science?
Python, 3ème en 2014 (derrière R et SAS)
R.R. – Université Ly on 2 20