Cours d’Informatique Scientifique
Programmation en Python Cours 7/8
Laurent Pointal
laurent.pointal @ limsi.fr
@ laposte.net
Source des illustrations: OpenClipArt.org et créations personnelles.
Programme de la séance
●
Concepts Programmation Orientée Objet
●
Utilité ?
●
Interactions
●
Familles d’objets : classes
●
Encapsulation
●
Composition / Agrégation
●
Héritage
●
POO en Python
●
Définition d ’une classe
●
Création d’objets
●
Utilisation d’objets
Laurent PointalDépartement Mesures Physiques Cours d’Informatique Scientifique 7/8 3 22
v2.2
Programmation Orientée Objets
Modéliser
Réutiliser
Programmation Procédurale
Programmation Orientée Objets (POO)
Étendre Hériter (Dériver)
Composer / Agréger Encapsulation
Comportement
Méthodes
Attributs
aurent PointalDépartement Mesures Physiques Cours d’Informatique Scientifique 7/8 4 22
v2.2
Interactions
Attributs Méthodes
Objet
Attributs Méthodes
Objet
Attributs Méthodes
Objet Monde
Extérieur
Laurent PointalDépartement Mesures Physiques Cours d’Informatique Scientifique 7/8 5 22
v2.2
Des familles: les Classes
●
Nombres (int, float, …bool)
●
Chaînes (str)
●
Séquences (list, tuple, …)
●
Dictionnaires (dict)
●
Ensembles (set, …)
●
Fichiers
●
…
3 instance de int
>>> type(x)
<class 'int'>
>>> type("toto")
<class 'str'>
>>> type([1,2,3])
<class 'list'>
>>> type(f)
<class '_io.TextIOWrapper'>
>>> isinstance(3,int) True
Les objets sont des “instances” de classes.
x = 3
f = open("data.txt","w",encoding="utf-8")
x
f
Objet Fichier pour
"data.txt" instance de _io.TextIOWrapper
>>> x.__class__
<class 'int'>
aurent PointalDépartement Mesures Physiques Cours d’Informatique Scientifique 7/8 6 22
v2.2
Encapsulation
L’objet encapsule (regroupe) un accès aux:
●
attributs d’instance (ou variables membres), propriétés liées à l’objet,
●
opérations (ou méthodes) que la classe de l’objet permet.
real: 3 imag: 1.4
complex
conjugate()
Objets Classe
real: 4.672 imag: -78.9
real: 0 imag: 8.24
Exemple avec les complexes:
Il peut aussi y avoir des attributs de classe, partagés par tous les objets d’une classe.
>>> c1 = complex(3, 1.4)
>>> c1 (3+1.4j)
>>> c1.real 3.0
>>> c1.imag
1.4 >>> c2 = c1.conjugate()
>>> c2
(3-1.4j)
Laurent PointalDépartement Mesures Physiques Cours d’Informatique Scientifique 7/8 7 22
v2.2
Composition / Agrégation
L’objet est composé d'attributs qui sont eux-même des objets d’autres classes. x a un y
protocole:
dateheure: "2012-02-13 11:23"
experimentateur: "Maxime"
valeurs: [(15e3,13.9),(15.01e3,11.2),…]
ResultatsExpe
spectroscopie
agrégation
composition
aurent PointalDépartement Mesures Physiques Cours d’Informatique Scientifique 7/8 8 22
v2.2
Héritage (ou dérivation)
Une classe pour définir un modèle spécialisé de quelque chose de plus générique. x est un y
AppareilDeMesure
HP3455A
Laurent PointalDépartement Mesures Physiques Cours d’Informatique Scientifique 7/8 9 22
v2.2
Héritage (ou dérivation)
D'autres classes pour définir d'autres modèles d'appareils de mesure.
AppareilDeMesure
HP3455A Keithley2000E
Agilent34405A
aurent PointalDépartement Mesures Physiques Cours d’Informatique Scientifique 7/8 10 22
v2.2
Héritage (ou dérivation)
De objets de chaque classe, que l'on va utiliser dans des programmes.
AppareilDeMesure
HP3455A
Volt.HP#2 Volt.HP#1
Keithley2000E Agilent34405A
Volt.Agil#1 Volt.Kei#1 Volt.Kei#1
Laurent PointalDépartement Mesures Physiques Cours d’Informatique Scientifique 7/8 11 22
v2.2
Héritage Multiple (à éviter)
Parfois on a besoin d’hériter de plusieurs classes…
À éviter autant que possible, ou à utiliser en connaissant les
implications.
AppareilDeMesure
HP3455A
SystemeElectronique
Un appareil pour
réaliser des mesures Un système qu'il faut localiser, alimenter, entretenir...
A
B C
D
Héritage en diamant
aurent PointalDépartement Mesures Physiques Cours d’Informatique Scientifique 7/8 12 22
v2.2
Attributs & méthodes hérités
Bénéficier des méthodes et attributs définis dans une classe parente.
HP3455A
AppareilDeMesure
●
catégorie
●
identifiant
●
canaux
●
unites
●
initialiser()
●
mesurer()
●
lire()
●
afficher()
●
affichertout()
●
tensionmax
●
interface
●
initialiser()
●
mesurer()
●
lire()
●
etalonner() catégorie:…
identifiant:…
canaux:…
unites:…
tensionmax:…
interface:… Script...
Laurent PointalDépartement Mesures Physiques Cours d’Informatique Scientifique 7/8 13 22
v2.2
Définition de Classe
class HP3455A(AppareilDeMesure) :
"""Gestion d'un voltmètre HP 3455A."""
def lire(self,p_numcanal) :
"""Lit la mesure sur un canal particulier."""
if not 0<=p_numcanal<len(self.canaux):
raise ValueError("numéro de canal invalide")
1
erparamètre : self
Référence l’objet sur lequel on travaille, espace de noms pour accéder aux
attributs et aux méthodes.
Bloc de définition de la classe, indenté dans le module.
Bloc de définition de la méthode, indenté par rapport à la classe.
Héritage
Accès aux attributs de l’objet.
aurent PointalDépartement Mesures Physiques Cours d’Informatique Scientifique 7/8 14 22
v2.2
Création d’objets
h1 = HP3455A("Volt.HP#1","COM1") h2 = HP3455A("Volt.HP#2","COM2")
Utiliser la classe comme une fonction, lui fournir les paramètres de construction de l’objet.
Construction de l’objet:
1) Création par Python d'un objet HP3455A vierge en mémoire.
2) Appel de sa méthode __init__(objet, paramètres de construction…).
class HP3455A(AppareilDeMesure) :
"""Pilotage d'un voltmètre Hewlett Packard 3455A."""
def __init__(self,p_ident,p_serie) :
"""Construction des attributs du HP3455A"""
super().__init__("voltmetre", p_ident, 6, "Volt") self.tensionmax = 1000
self.interface = "serial:"+p_serie+"/9600/8N2"
Appel méthode __init__ de la classe héritée !
Stockage des valeurs dans l’objet (self.xxx).
Laurent PointalDépartement Mesures Physiques Cours d’Informatique Scientifique 7/8 15 22
v2.2
Utilisation d’objets
Vous l’avez déjà fait avec les chaînes de caractères, listes, dictionnaires, fichiers…
h1 = HP3455A("Volt.HP#1" ," COM1"))
print ("Appareil:", h1.identifiant, "(",h1.categorie,")" )
for canal in h1.canaux:
print("Mesure:", canal) h1.initialiser()
h1.mesurer() h1.liretout()
h1.affichertout()
Accès aux attributs et méthodes en utilisant l’espace de noms de
la variable qui référence l’objet manipulé.
aurent PointalDépartement Mesures Physiques Cours d’Informatique Scientifique 7/8 16 22
v2.2
Méthodes spéciales __xxx__
Elles sont utilisées par
●
les opérateurs mathématiques, logiques...
●
les fonctions génériques
real: 3 imag: 1.4
complex
Objets Classe
Méthodes:
●
conjugate()
Méthodes spéciales:
●
__init__()
●
__str__()
●
__add__()
●
__mul__()
●
__float__()
●
__abs__()
●
…
Opérateurs:
●
+ -
●
* / // %
●
**
Fonctions génériques:
●
abs() real: 4.672
imag: -78.9
real: 0 imag: 8.24
Voir au verso de l'Abrégé Dense Python.
Les méthodes «normales» n'ont pas
de double souligné ! C'est réservé.
Laurent PointalDépartement Mesures Physiques Cours d’Informatique Scientifique 7/8 17 22
v2.2
Une application: Polynôme de degré 2
Déjà vu en TP, de façon procédurale.
Comment passer en objets ?
Attributs ?
Opérations ?
aurent PointalDépartement Mesures Physiques Cours d’Informatique Scientifique 7/8 18 22
v2.2
Poly2 - Construction
class Poly2(object) :
"""Polynôme du second degré."""
def __init__(self,p_coefa,p_coefb,p_coefc) :
"""Construit un polynôme à partir des coefficients a,b,c."""
self.a = p_coefa self.b = p_coefb self.c = p_coefc
Pour le polynôme 3x² + 2x - 1, on veut pouvoir écrire:
p = Poly2(3,2,-1)
>>> from polynome_m import *
>>> p = Poly2(3,2,-1)
>>> p.a 3
>>> p1 = Poly2(-0.5,6.2,3.8)
>>> p1.b 6.2
>>> p.b 2
Utilisation:
Création d’un module polynome_m :
Laurent PointalDépartement Mesures Physiques Cours d’Informatique Scientifique 7/8 19 22
v2.2
Poly2 - Affichage
>>> p = Poly2(3,2,-1)
>>> print(p)
<polynome_m.Poly2 object at 0x7f5a93c92fd0>
Améliorons les choses…
class Poly2(object) :
…
def __str__(self) :
"""Chaîne d'affichage du polynôme."""
s = "{0.a}x²+{0.b}x+{0.c}".format(self) return s
>>> from polynome_m import *
>>> p = Poly2(3,2,-1)
>>> print(p) 3x²+2x+-1
Note: on peut faire esthétiquement mieux, voir le fichier source final.
aurent PointalDépartement Mesures Physiques Cours d’Informatique Scientifique 7/8 20 22
v2.2
Poly2 - Extraction des racines
class Poly2(object) : …
def discriminant(self) :
"""Retourne le discriminant ("delta") du polynôme."""
return self.b**2 - (4*self.a*self.c)
def racines(self) :
"""Retourne un tuple contenant les racines réelles du polynôme.
Le tuple peut être vide, contenir une racine, ou contenir deux racines.
"""
delta = self.discriminant() if delta < 0:
return () elif delta == 0:
return (-self.b / (2*self.a), ) else:
x1 = (-self.b - sqrt(delta))/(2*self.a) x2 = (-self.b + sqrt(delta))/(2*self.a) return (x1,x2)
Méthode racines() de Poly2 qui retourne un tuple:
>>> p = Poly2(3,2,-1)
>>> p.racines()
(-1.0, 0.3333333333333333)
Laurent PointalDépartement Mesures Physiques Cours d’Informatique Scientifique 7/8 21 22
v2.2
Poly2 - Évaluation
class Poly2(object) : …
def calcul(self,p_x) :
"""Calcul du polynôme pour valeur x."""
return self.a*p_x**2 + self.b*p_x + self.c
Pour calculer l’évaluation du polynôme pour une valeur de x :
class Poly2(object) : …
def __call__(self,p_x) :
"""Utilisation du polynome comme une fonction."""
return self.calcul(p_x)
>>> p = Poly2(3,2,-1)
>>> p.calcul(2) 15
>>> p = Poly2(3,2,-1)
>>> p(2) 15
Et afin d’utiliser le polynôme comme si c’était une fonction :
aurent PointalDépartement Mesures Physiques Cours d’Informatique Scientifique 7/8 22 22
v2.2