• Aucun résultat trouvé

Programmation en Python Cours 7/8

N/A
N/A
Protected

Academic year: 2022

Partager "Programmation en Python Cours 7/8"

Copied!
22
0
0

Texte intégral

(1)

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.

(2)

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

(3)

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

(4)

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

(5)

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'>

(6)

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)

(7)

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

(8)

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

(9)

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

(10)

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

(11)

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

(12)

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...

(13)

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

er

paramè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.

(14)

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).

(15)

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é.

(16)

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é.

(17)

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 ?

(18)

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 :

(19)

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.

(20)

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)

(21)

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 :

(22)

aurent PointalDépartement Mesures Physiques Cours d’Informatique Scientifique 7/8 22 22

v2.2

Poly2 - Calculs avec des polynômes

>>> p1 = Poly2(1,1,1)

>>> p2 = Poly2(-2,4,2)

>>> print(p1+p2) -1x²+5x+3

>>> print(p1+8) x²+x+9

>>> print(p2*5) -10x²+20x+10 On veut pouvoir écrire:

class Poly2(object) :

def __add__(self,p_o) :

"""Ajout d'une valeur à la valeur du polynome."""

if isinstance(p_o,Poly2) :

return Poly2(self.a+p_o.a,self.b+p_o.b,self.c+p_o.c) else : # On assume que c'est un nombre...

return Poly2(self.a,self.b,self.c+p_o) def __mul__(self,p_o) :

"""Multiplication de la valeur du polynome par une valeur."""

# On assume que c'est un nombre...

return Poly2(self.a*p_o,self.b*p_o,self.c*p_o)

Addition

Multiplication

Voir au verso de l’Abrégé Dense Python 3.1 la liste des méthodes spéciales.

Références

Documents relatifs

aurent PointalDépartement Mesures Physiques Cours d’Informatique Scientifique 1/8 3

Exécuté avec variable valant tour à tour chacune des valeurs de séquence. On parle de “boucle for”, de “parcours

Il y a tout d’abord les cahiers qui lui servent de journal intime où consigner ses rêves, mais aussi de brouillons préparatoires pour ses graffiti et même de

D’autre part, dans l’ensemble du Kérala, du pays tamoul et au Sri Lanka, il est au cœur de l’histoire de Kannaki, mais sans être davantage qu’un élément narratif :

L'auteur explique comment ces objets vivants, usuels mais aussi dotés d'une signification sociale et symbolique au XVIIIe siècle, sont devenus des objets inanimés mais

:فظنلأا جاتنلإا او لاعفلا ءادلأا ةينقتلا هذه دعت ةدعاقل لأا جنل ةيساس ةرادلإا ماظن حا ا اهفيرعت تم ثيح ،ةيئيبل ةدحتلما مملأل يئيبلا جمانبرلا لبق نم (

À l’aide des données issues d’une enquête ethnographique et par collecte de récits de vie, conduite en France et en Belgique, auprès de cette typologie de couple,

Pour trouver le résultat d’une multiplication par 10, il suffit de noter le nombre multiplié et de placer le zéro du 10 à droite... La moitié , c’est deux