•Introduction à la programmation orientée objet •interfaces graphiques

publicité
Programmation
scientifique
•I
n t r o d u c t i o n à l a
p r o g r a m m a t i o n o r i e n t é e
•i n t e r f a c e s g r a p h i q u e s
Tuesday, March 30, 2010
o b j e t
Programmation
orientée objet
Approche pour de grands programmes
POO conduit à des modules qui peuvent évoluer
indépendemment
La plupart des modules Python (mais aussi matlab
etc..) utilisent la POO: important d’en connaître les
bases
Même vos programmes «simples» en utilisent...
Tuesday, March 30, 2010
Programmation procédurale
Ce dont vous avez l’habitude.
Programme décrit avec explicitement la séquence des opérations
à faire.
Accent sur les algorithmes, les procédures.
Séparation entre procédures et données
Améliorations:
• structuration du code: diviser le programme en blocs de
procédures ou fonctions réutilisables.
• Code organisé autant que possible en blocs structurés,
organisés de manière logique
Tuesday, March 30, 2010
Programmation orientée objet
Définir des types de données qui correspondent à votre problème
Avantages:
•
les types de données sont plus simples à isoler que des
algorithmes
•
les types de données sont plus stables que les algorithmes
qui peuvent évoluer
•
les types de données encapsulent l’implémentation
Stratégie:
•
•
identifier les types de données pour votre problème
•
écrire le programme qui les utilisent...
Tuesday, March 30, 2010
implémenter dans des classes regroupant les définitions des
variables (pour les données) et des algorithmes (méthodes)
pour les traiter.
Programmation objet
Tuesday, March 30, 2010
Programmation objet
Les objets sont des variables qui ont une identité (la classe) et des fonctions
(les méthodes) qui opèrent sur elles.
Tuesday, March 30, 2010
Programmation objet
Les objets sont des variables qui ont une identité (la classe) et des fonctions
(les méthodes) qui opèrent sur elles.
Tuesday, March 30, 2010
Programmation objet
Les objets sont des variables qui ont une identité (la classe) et des fonctions
(les méthodes) qui opèrent sur elles.
Les données peuvent ressembler à de nombreuses choses:
Tuesday, March 30, 2010
Programmation objet
Les objets sont des variables qui ont une identité (la classe) et des fonctions
(les méthodes) qui opèrent sur elles.
Les données peuvent ressembler à de nombreuses choses:
– soit un vecteur 3x1. Est-ce qu’il représente:
Tuesday, March 30, 2010
Programmation objet
Les objets sont des variables qui ont une identité (la classe) et des fonctions
(les méthodes) qui opèrent sur elles.
Les données peuvent ressembler à de nombreuses choses:
– soit un vecteur 3x1. Est-ce qu’il représente:
• une date (jour/mois/année)
Tuesday, March 30, 2010
Programmation objet
Les objets sont des variables qui ont une identité (la classe) et des fonctions
(les méthodes) qui opèrent sur elles.
Les données peuvent ressembler à de nombreuses choses:
– soit un vecteur 3x1. Est-ce qu’il représente:
• une date (jour/mois/année)
• un point dans l’espace 3D
Tuesday, March 30, 2010
Programmation objet
Les objets sont des variables qui ont une identité (la classe) et des fonctions
(les méthodes) qui opèrent sur elles.
Les données peuvent ressembler à de nombreuses choses:
– soit un vecteur 3x1. Est-ce qu’il représente:
• une date (jour/mois/année)
• un point dans l’espace 3D
– coordonnées cartésiennes
Tuesday, March 30, 2010
Programmation objet
Les objets sont des variables qui ont une identité (la classe) et des fonctions
(les méthodes) qui opèrent sur elles.
Les données peuvent ressembler à de nombreuses choses:
– soit un vecteur 3x1. Est-ce qu’il représente:
• une date (jour/mois/année)
• un point dans l’espace 3D
– coordonnées cartésiennes
– coordonnées cylindriques
Tuesday, March 30, 2010
Programmation objet
Les objets sont des variables qui ont une identité (la classe) et des fonctions
(les méthodes) qui opèrent sur elles.
Les données peuvent ressembler à de nombreuses choses:
– soit un vecteur 3x1. Est-ce qu’il représente:
• une date (jour/mois/année)
• un point dans l’espace 3D
– coordonnées cartésiennes
– coordonnées cylindriques
– coordonnées sphériques
Tuesday, March 30, 2010
Programmation objet
Les objets sont des variables qui ont une identité (la classe) et des fonctions
(les méthodes) qui opèrent sur elles.
Les données peuvent ressembler à de nombreuses choses:
– soit un vecteur 3x1. Est-ce qu’il représente:
• une date (jour/mois/année)
• un point dans l’espace 3D
– coordonnées cartésiennes
– coordonnées cylindriques
– coordonnées sphériques
• un polynome quadratique
Tuesday, March 30, 2010
Programmation objet
Les objets sont des variables qui ont une identité (la classe) et des fonctions
(les méthodes) qui opèrent sur elles.
Les données peuvent ressembler à de nombreuses choses:
– soit un vecteur 3x1. Est-ce qu’il représente:
• une date (jour/mois/année)
• un point dans l’espace 3D
– coordonnées cartésiennes
– coordonnées cylindriques
– coordonnées sphériques
• un polynome quadratique
• autre chose.…
Tuesday, March 30, 2010
Programmation objet
Les objets sont des variables qui ont une identité (la classe) et des fonctions
(les méthodes) qui opèrent sur elles.
Les données peuvent ressembler à de nombreuses choses:
– soit un vecteur 3x1. Est-ce qu’il représente:
• une date (jour/mois/année)
• un point dans l’espace 3D
– coordonnées cartésiennes
– coordonnées cylindriques
– coordonnées sphériques
• un polynome quadratique
• autre chose.…
Quelles fonctions s’appliquent sur ces données?
Tuesday, March 30, 2010
Programmation objet
Les objets sont des variables qui ont une identité (la classe) et des fonctions
(les méthodes) qui opèrent sur elles.
Les données peuvent ressembler à de nombreuses choses:
– soit un vecteur 3x1. Est-ce qu’il représente:
• une date (jour/mois/année)
• un point dans l’espace 3D
– coordonnées cartésiennes
– coordonnées cylindriques
– coordonnées sphériques
• un polynome quadratique
• autre chose.…
Quelles fonctions s’appliquent sur ces données?
Les classes donnent une identité, et associent des fonctions à cette identité (ne
permettent pas à deux dates d’être multipliées).
Tuesday, March 30, 2010
Programmation objet
Les objets sont des variables qui ont une identité (la classe) et des fonctions
(les méthodes) qui opèrent sur elles.
Les données peuvent ressembler à de nombreuses choses:
– soit un vecteur 3x1. Est-ce qu’il représente:
• une date (jour/mois/année)
• un point dans l’espace 3D
– coordonnées cartésiennes
– coordonnées cylindriques
– coordonnées sphériques
• un polynome quadratique
• autre chose.…
Quelles fonctions s’appliquent sur ces données?
Les classes donnent une identité, et associent des fonctions à cette identité (ne
permettent pas à deux dates d’être multipliées).
Les opérations possibles (méthodes) sur un objet (instance d’une classe) sont
encapsulées dans la classe: protection des données et du code.
Tuesday, March 30, 2010
Programmation objet
Les objets sont des variables qui ont une identité (la classe) et des fonctions
(les méthodes) qui opèrent sur elles.
Les données peuvent ressembler à de nombreuses choses:
– soit un vecteur 3x1. Est-ce qu’il représente:
soustraire additionner deux dates
• une date (jour/mois/année)
• un point dans l’espace 3D
– coordonnées cartésiennes
– coordonnées cylindriques
– coordonnées sphériques
• un polynome quadratique
• autre chose.…
Quelles fonctions s’appliquent sur ces données?
Les classes donnent une identité, et associent des fonctions à cette identité (ne
permettent pas à deux dates d’être multipliées).
Les opérations possibles (méthodes) sur un objet (instance d’une classe) sont
encapsulées dans la classe: protection des données et du code.
Tuesday, March 30, 2010
Programmation objet
Les objets sont des variables qui ont une identité (la classe) et des fonctions
(les méthodes) qui opèrent sur elles.
Les données peuvent ressembler à de nombreuses choses:
– soit un vecteur 3x1. Est-ce qu’il représente:
• une date (jour/mois/année)
• un point dans l’espace 3D
– coordonnées cartésiennes
– coordonnées cylindriques
– coordonnées sphériques
soustraire additionner deux dates
distance entre deux points
• un polynome quadratique
• autre chose.…
Quelles fonctions s’appliquent sur ces données?
Les classes donnent une identité, et associent des fonctions à cette identité (ne
permettent pas à deux dates d’être multipliées).
Les opérations possibles (méthodes) sur un objet (instance d’une classe) sont
encapsulées dans la classe: protection des données et du code.
Tuesday, March 30, 2010
Programmation objet
Les objets sont des variables qui ont une identité (la classe) et des fonctions
(les méthodes) qui opèrent sur elles.
Les données peuvent ressembler à de nombreuses choses:
– soit un vecteur 3x1. Est-ce qu’il représente:
• une date (jour/mois/année)
• un point dans l’espace 3D
– coordonnées cartésiennes
– coordonnées cylindriques
– coordonnées sphériques
soustraire additionner deux dates
distance entre deux points
Ceci sont différentes «méthodes»
• un polynome quadratique
• autre chose.…
Quelles fonctions s’appliquent sur ces données?
Les classes donnent une identité, et associent des fonctions à cette identité (ne
permettent pas à deux dates d’être multipliées).
Les opérations possibles (méthodes) sur un objet (instance d’une classe) sont
encapsulées dans la classe: protection des données et du code.
Tuesday, March 30, 2010
Programmation objet
Les objets sont des variables qui ont une identité (la classe) et des fonctions
(les méthodes) qui opèrent sur elles.
Les données peuvent ressembler à de nombreuses choses:
– soit un vecteur 3x1. Est-ce qu’il représente:
• une date (jour/mois/année)
• un point dans l’espace 3D
– coordonnées cartésiennes
– coordonnées cylindriques
– coordonnées sphériques
• un polynome quadratique
• autre chose.…
soustraire additionner deux dates
distance entre deux points
Ceci sont différentes «méthodes»
additionner, multiplier, soustraire,
évaluer, dériver
Quelles fonctions s’appliquent sur ces données?
Les classes donnent une identité, et associent des fonctions à cette identité (ne
permettent pas à deux dates d’être multipliées).
Les opérations possibles (méthodes) sur un objet (instance d’une classe) sont
encapsulées dans la classe: protection des données et du code.
Tuesday, March 30, 2010
Programmation objet
Les objets sont des variables qui ont une identité (la classe) et des fonctions
(les méthodes) qui opèrent sur elles.
Les données peuvent ressembler à de nombreuses choses:
Différentes identités
– soit un vecteur 3x1. Est-ce qu’il représente:
• une date (jour/mois/année)
• un point dans l’espace 3D
– coordonnées cartésiennes
– coordonnées cylindriques
– coordonnées sphériques
• un polynome quadratique
• autre chose.…
soustraire additionner deux dates
distance entre deux points
Ceci sont différentes «méthodes»
additionner, multiplier, soustraire,
évaluer, dériver
Quelles fonctions s’appliquent sur ces données?
Les classes donnent une identité, et associent des fonctions à cette identité (ne
permettent pas à deux dates d’être multipliées).
Les opérations possibles (méthodes) sur un objet (instance d’une classe) sont
encapsulées dans la classe: protection des données et du code.
Tuesday, March 30, 2010
Programmation objet: exemple 1
Exemple: beaucoup d’opérations standards sont associées à des
chaînes de caractères, comme passer cette chaîne en minuscule, en
majuscule, découper la chaîne, etc…
Dans un langage orienté objet, ces opérations sont des propriétés de
l’objet chaîne de caractères, on les appelle des méthodes
>>>original_string = ' un texte '
# enlever l’espace du début et de la fin
>>>string1 = original_string.strip()
# passé en majuscule
>>>string2 = string1.upper()
>>>print string2
>>>UN TEXTE
# test si minuscule ?
>>>string2.lower() == string1
>>>True
Tuesday, March 30, 2010
string2.lower() signifie
“appelle la méthode lower de
l’objet string2“ .
chaque chaîne de caractères est un
objet chaîne de caractères et possède
toutes les méthodes d’un objet de type
chaîne de caractères
Créer une classe en python
class OurClass(object):
"""Class docstring."""
def __init__(self, arg1, arg2):
"""Method docstring."""
self.arg1 = arg1
self.arg2 = arg2
def printargs(self):
"""Method docstring."""
print self.arg1
print self.arg2
Définition (héritage de la classe objet)
«Créateur» d’un objet de
cette classe lors d’une
instance (méthode __init_)
Référence à l’objet instancié
Ici définition d’une méthode, nommée
«printargs»
instance = OurClass('arg1', 'arg2')
print type(instance)
Dans cet exemple nous créons une instance de
<class 'OurClass'>
OurClass, et nous l’appelons instance. Quand
instance.printargs()
nous la créons, nous passons arg1 et arg2 en
arg1
arg2
arguments.
Tuesday, March 30, 2010
Définition d’une classe : Exemple 2
class Point:
‘’’Definition d'un point mathematique’’’
def __init__(self):
self.x=0.0
self.y=0.0
self.z=0.0
Méthode «constructeur»
def affiche(self):
print ‘x=’+str(self.x)+’ y=’ +str(self.y)+’ z=’+str(self.z)
Sauvegarde dans «geometrie.py»
>>>import geometrie
>>>A=Point()
>>>B=Point()
>>>A.x=-5.
>>>A.y=15.
>>>B.x=5
>>>A.affiche()
>>>x=-5. y=15. z=0.
>>>B.affiche()
>>>x=5. y=0. z=0.
Variables(attributs) d’instance
>>>print Point.__doc__
>>> Definition d'un point mathematique
Tuesday, March 30, 2010
Définition d’une classe : Exemple 2
(suite)
class Point:
‘’’Definition d'un point mathematique’’’
def __init__(self,xx=0.,yy=0.,zz=0.):
self.x=xx
self.y=yy
self.z=zz
def affiche(self):
print ‘x=’+str(self.x)+’ y=’ +str(self.y)+’ z=’+str(self.z)
>>>import geometrie
>>>A=Point(-5,15,5)
>>>B=Point(xx=5)
>>>A.affiche()
>>>x=-5. y=15. z=0.
>>>B.affiche()
>>>x=5. y=0. z=0.
>>>A.y
>>>15.
>>>C=Point(-5,15,5)
>>>print(A==C)
>>>0
Tuesday, March 30, 2010
Chaque instance est un
espace de nom distinct
Définition d’une classe : Exemple 2
(suite
2)
!"#$%"&'&(")*+*,*-+&.,&$,*/*#0,*-+&12$+.&3/0##.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!"#$%&$'(()"#*+,%-"+*.)""""""""""""!
!"'/+)/$"0"12345--)-6"758&)6"9::;""!
!"<5=)-=)"0"1#7""""""""""""""""""""!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
=<'>>"#%5-+0
""""???.%5-+"('+,@('+5A/)???
""""B)C"DD5-5+DDE>)<C6"F6"*G0
"""""""">)<C2F"H"F
"""""""">)<C2*"H"*
""""
=<'>>"I)=+'-&<)0
""""???$)=+'-&<)???
""""B)C"DD5-5+DDE>)<C6"'-&6"<'$6",'/G0
"""""""">)<C2'-&"H"'-&
"""""""">)<C2<'$"H"<'$
"""""""">)<C2,'/"H",'/
9$&4:$;;+&+;7&<*&20<:+&;+#3$*7&/&.#0%<)#+&%+;
0=>+7;?&@8$4<*&%A+<B&;+#$&<*+&)*;7$*4+&%+&:$
4:$;;+&40*;)%"#"+?&&
9+;&)*;7$*4+;&%+&:$&4:$;;+&50)*7CD
;+#0*7&%+;&0=>+7;&7#E;&;)2.:+;&F<)&.0;;"%+#0*7
;+<:+2+*7&<*&$77#)=<7&ABA&+7&<*&$77#)=<7&A6A&G
):;&*+&;+#0*7&%07";&%A$<4<*+&2"780%+?
9+&.$#$2E7#+& ;+:H &%";)1*+&70<7+;&:+;&)*;7$*4+;
F<)&;+#0*7&.#0%<)7+;&.$#&4+77+&4:$;;+
9+;&)*;7$*4+;&%+&:$&4:$;;+&I+47$*1:+CD
.0;;"%+#0*7&J&$77#)=<7;&,&:+&.#+2)+#&C&A$*1A&D
%0)7&K7#+&:<)L2K2+&<*&0=>+7&%+&4:$;;+&50)*7CD?
M:&;+#3)#$&/&2"20#);+#&:+;&400#%0**"+;&%+
:A$*1:+&;<."#)+<#&1$<48+&%<&#+47$*1:+?
""""B)C"+$%/J)K)-+$)E>)<CG0
""""""""F="H">)<C2'-&2F"L">)<C2<'$"M9
""""""""*="H">)<C2'-&2*"L">)<C2,'/"M9
""""""""$)+/$-"#%5-+EF=6"*=G
9$&4:$;;+&I+47$*1:+CD&402.0#7+&<*+&2"780%+N
F<)&#+*3+##$&<*&0=>+7&%+&4:$;;+&50)*7CD&$<
.#01#$22+&$..+:$*7?
=<'>>"K'$$)EI)=+'-&<)G0
""""???='$$@"H"$)=+'-&<)".'$+5=/<5)$???
""""B)C"DD5-5+DDE>)<C6"=%5-6"=%+)G0
""""""""I)=+'-&<)2DD5-5+DDE>)<C6
"""""""""""""""=%5-6"=%+)6"=%+)G
"""""""">)<C2=%+)"H"=%+)
@$##+CD&+;7&<*+&4:$;;+&%"#)3"+N&F<)&8"#)7+&:+;
$77#)=<7;&+7&2"780%+;&%+&:$&4:$;;+&I+47$*1:+CD?
'0*&40*;7#<47+<#&%0)7&H$)#+&$..+:&$<
40*;7#<47+<#&%+&:$&4:$;;+&.$#+*7+N&+*&:<)
7#$*;2+77$*7&:$&#"H"#+*4+&%+&:A)*;7$*4+&C;+:HD
4022+&.#+2)+#&$#1<2+*7?
""""B)C">/$C'=)E>)<CG0
""""""""$)+/$-">)<C2=%+)NN9
9$&4:$;;+&@$##+CD&402.0#7+&<*+&2"780%+&%+
.:<;&F<+&;$&4:$;;+&.$#+*7+?&
!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!"#$%&$'(()".$5-=5.'<"0"!!
""""""""
Tuesday, March
30, 2010
!"=%%$B2"B)"9"=%5->">/.2"&'/=,)>"0""
G. Swinnen: Apprendre à programmer
50<#&4#"+#&C0<&)*;7$*4)+#D&<*&0=>+7N&):&;<HH)7
%A$HH+47+#&<*+&4:$;;+&/&<*+&3$#)$=:+?
avec Python
"""""""""""""""=%5-6"=%+)6"=%+)G
"""""""">)<C2=%+)"H"=%+)
7#$*;2+77$*7&:$&#"H"#+*4+&%+&:A)*;7$*4+&C;+:HD
4022+&.#+2)+#&$#1<2+*7?
Définition d’une classe : Exemple 2
(suite
3)
9$&4:$;;+&@$##+CD&402.0#7+&<*+&2"780%+&%+
.:<;&F<+&;$&4:$;;+&.$#+*7+?&
""""B)C">/$C'=)E>)<CG0
""""""""$)+/$-">)<C2=%+)NN9
!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!"#$%&$'(()".$5-=5.'<"0"!!
""""""""
!"=%%$B2"B)"9"=%5->">/.2"&'/=,)>"0""
=>&I"H"#%5-+EO:6;:G
=>&K"H"#%5-+EP:69QG
50<#&4#"+#&C0<&)*;7$*4)+#D&<*&0=>+7N&):&;<HH)7
%A$HH+47+#&<*+&4:$;;+&/&<*+&3$#)$=:+?
9+;&)*;7#<47)0*;&4)L40*7#+&4#"+*7&%0*4
%+<B&0=>+7;&%+&:$&4:$;;+&50)*7CD???
!"?R%S+)>?"$)=+'-&/<'5$)")+"='$$@)"0"
R%5+)I"H"I)=+'-&<)E=>&I6"P::6"Q:G
R%5+)K"H"K'$$)E=>&K6"O:G
???&+7&4+::+;L4)N&+*40#+&%+<B&$<7#+;&0=>+7;?
O07+&,&.$#&40*3+*7)0*N&:+&*02&%A<*+&4:$;;+
4022+*4+&.$#&<*+&:+77#+&2$><;4<:+
!"K%%$B%--@)>"B/"=)-+$)".%/$"=,'=/-)"0
=I"H"R%5+)I2+$%/J)K)-+$)EG
=K"H"R%5+)K2+$%/J)K)-+$)EG
.$5-+"?=)-+$)"B/"$)=+2"0?6"=I2F6"=I2*
.$5-+"?=)-+$)"B/"='$$@"0?6"=K2F6"=K2*
.$5-+"?>/$C2"B/"='$$@"0?6
.$5-+"R%5+)K2>/$C'=)EG
!"#$%
Tuesday, March 30, 2010
9$&2"780%+&7#0<3+@+*7#+CD&H0*47)0**+&.0<#
:+;&0=>+7;&%+;&%+<B&76.+;N&.<);F<+&:$&4:$;;+
@$##+CD&$&8"#)7"&%+&4:$;;+&I+47$*1:+CD?
5$#&40*7#+N&:$&2"780%+&;<#H$4+CD&*+&.+<7&K7#+
)*30F<"+&F<+&.0<#&:+;&0=>+7;&4$##";?
!"#$#%&'()**+*&,&-..#+*%#+&/&.#01#$22+#&$3+4&56780*
Définition d’une classe : Exemple 2
(suite 4)
class Rectangle(Point):
'''Definition rectangle'''
Héritage des propriétés
de la classe Point()
def __init__(self,largeur=1.,hauteur=1.,xx=0.,yy=0.,zz=0.):
self.largeur=largeur
self.hauteur=hauteur
self.coin=Point(xx,yy,zz)
«Surcharge» de la méthode
affiche()
def affiche(self):
print 'Position'
self.coin.affiche()
print 'largeur='+str(self.largeur)+\
' hauteur=' +str(self.hauteur)
>>>mon_rectangle1=Rectangle
>>>mon_rectangle2=Rectangle(largeur=5,hauteur=10)
>>>mon_rectangle3=Rectangle(xx=1.,yy=2.)
>>>mon_rectangle1.affiche()
Position
x=0. y=0. z=0.
largeur=1 hauteur=1
Tuesday, March 30, 2010
Polymorphisme
Idée: Différents types d’objets peuvent implémenter différentes
opérations équivalentes en utilisant les mêmes noms. Les
algorithmes peuvent être implémentés une fois pour toute pour
tous ces types. Grâce à la surcharge.
Exemples
Atomes
atom = Atom(‘C’, Vector(0., 0., 1.))
atom.translateBy(Vector(-1., 1., 0.))
print atom.mass()
print atom.centerOfMass()
Molecules:
molecule = Molecule([atom1, atom2, atom3])
molecule.translateBy(Vector(-1., 1., 0.))
print molecule.mass()
print molecule.centerOfMass()
Tuesday, March 30, 2010
Code générique
def moveToOrigin(something):
cm = something.centerOfMass()
something.translateBy(-cm)
moveToOrigin(atom)
moveToOrigin(molecule)
Programmation objet: surcharge
La surcharge permet à une méthode de nom donné de posséder un
sens différent suivant le type de leurs arguments. Par exemple,
sachant qu’en python un opérateur est une méthode et les types de
variables de classe, l’opérateur + est une méthode qui peut être
surchargée...:
x = 5 +9 # addition entière
s=’’ab’’+’’cd’’ # concaténation de chaines
Python possède des méthodes de surcharge pour :
tous les types (__str__,__float__);
les nombres (__add__,__div__, ...);
les séquences (__len__,__iter__, . . .)
Tuesday, March 30, 2010
Programmation objet: exemple
méthodes spéciale
import numpy as N
class Vector:
def __init__(self, x, y, z):
v = Vector(1., -0.5, 2)
!" v = v.__init__(1., -0.5, 2)
self.array = N.array([x,y,z], N.float)
def __repr__(self):
return 'Vector(%s,%s,%s)' % \
print v
!" print repr(v)
!" print v.__repr__()
(`self.array[0]`, `self.array[1]`,`self.array[2]`)
def __add__(self, other):
s = self.array + other.array
return Vector(s[0], s[1], s[2])
v = v1 + v2
!" v = v1.__add__(v2)
x = v[0]
!" x = v.__getitem__(0)
def __getitem__(self, index):
return self.array[index]
def length(self):
return N.sqrt(N.add.reduce(self.array*self.array))
Tuesday, March 30, 2010
Polymorphisme
class Atom:
class Molecule:
def __init__(self, element, position): def __init__(self, atom_list):
self.element = element
self.atoms = atom_list
self.position = position
def translateBy(self, vector):
self.position += vector
def translateBy(self, vector):
for atom in self.atoms:
atom.translateBy(vector)
def centerOfMass(self):
return self.position
def centerOfMass(self):
sum1 = 0.
sum2 = Vector(0., 0., 0.)
def mass(self):
for atom in self.atoms:
return masses[self.element.lower()]
sum1 += atom.mass()
sum2 += atom.mass()*atom.position
return sum2/sum1
def mass(self):
return N.sum([a.mass()
for a in self.atoms])
Tuesday, March 30, 2010
Héritage
Idée: Souvent un type d’objet est la spécialisation d’un autre.
Il peut hériter les opérations générales et y ajouter les siennes
particulières.
Exemple: chaine peptidique comme un cas spécial de
molécules
class PeptideChain(Molecule):
def __init__(self, residue_list):
self.residues = residue_list
atoms = []
for r in residue_list:
atoms += r.atoms
Molecule.__init__(self, atoms)
def __getitem__(self, index):
return self.residues[index]
Tuesday, March 30, 2010
Programmer en objet
Question centrale: quels sont les «bons» types dans un
programme?
• Demande de la pratique
• Essais erreurs
• Ne pas hésiter à ré-écrire un code pour une meilleure
conception: ça paye toujours dans le long terme
Candidats types objets:
•
•
•
Objets mathématiques: vecteurs, matrices, polynomes
Objets physiques: atomes, molécules, fonctions d’onde
Objets abstraits: algorithmes (par ex intégrateurs), éléments
graphiques
Tuesday, March 30, 2010
Modules
Un module est un fichier (extension .py) qui contient:
•des définition de fonctions
•des définitions de classes
•d’autres définitions (constantes,...)
En général un module «ne fait rien», il donne seulement les définitions
utilisées par d’autres modules ou par des programmes.
Mais en réalité il n’y a pas de réelle distinction entre un module et un
programme: un programme est un module dont e nom est __main__.
Tuesday, March 30, 2010
Module: exemple
File counting.py
def count_atoms_by_element(filename):
element_counts = {}
for line in file(filename):
if line[:6] == 'ATOM ':
element = line[76:78]
element_symbol = element.strip() # element is a two-character string,
# so we need to remove the spaces at the end
element_counts[element_symbol] = element_counts.get(element_symbol, 0) + 1
# count by element
return element_counts
def print_atom_counts(element_counts, element_names):
for element_name in element_names:
print element_name, element_counts.get(element_name.upper(), 0)
File count_atoms_pdb.py
from counting import count_atoms_by_element, print_atom_counts
import sys
filename = sys.argv[1]
element_names = sys.argv[2:]
element_counts = count_atoms_by_element(filename)
print_atom_counts(element_counts, element_names)
Tuesday, March 30, 2010
Où est-ce que Python cherche
pour des modules?
Quand on importe un module Python parcours une liste de répertoires,
s’arrêtant quand il trouve le fichier anvec le bon nom.
La liste des répertoirs parcourus est accessible sous Python:
import sys
print sys.path
Elle peut être changée (MacOS, Linux) en déclarant la variable
environnement PYTHONPATH:
export PYTHONPATH=$HOME/python (bash) or
setenv PYTHONPATH $HOME/python (csh)
Tuesday, March 30, 2010
Interfaces
graphiques
G r a p h i c a l U s e r
I n t e r f a c e ( G U I )
Tuesday, March 30, 2010
interfaces graphiques ?
Boites à outils graphiques
chargé de la gestion des différents composants
de l’interface : bouton, ascenseurs, zone de
texte
chargé de partager le serveur graphique entre les
différentes applications
chargé des primitives de dessin de bas niveau ;
Wikipedia
Tuesday, March 30, 2010
Boites à outils GUI
(Toolkits)
Couche de fonctions faisant le lien entre un
programme et les gestionnaires graphiques de
l’ordinateur (widget toolkit, widget library, GUI
toolkit). Elles viennent de l’OS, du gestionnaire de
fenêtres, ou de systèmes graphiques additionnels.
Propose un ensemble de routines (widgets) aux
programmes sous forme de Application
Programming Interfaces (API) pour tout ce qui est
gestion du graphisme et des interactions utilisateurs.
Tuesday, March 30, 2010
Widgets
Widgets: composants de programmation graphiques (routines)
Les Widgets d’un toolkit se conforment à un choix unifié de
spécifications de design pour l'esthétisme, la facilité
d’utilisation, les performances etc...
Exemple de widgets: la
création d’une fenêtre
simple, la création de
fenêtres avec
ascenseurs, boites de
dialogues, boutons,
etc...
Tuesday, March 30, 2010
Widgets
Actuellement généralement des hiérarchies de
classes (programmation objet).
Familles de composants graphiques:
Conteneurs
Boutons, ascenseurs
Dialogues
Objets graphiques (droites, cercles, etc...)
Transformations
Tuesday, March 30, 2010
Widgets spécialisés
Sur-couches aux toolkits GUI pour des tâches
particulières:
• graphismes scientifiques (matplotlib, mayavi)
• graphisme 3D (Vpython)
• animations (pygame)
• multimedia (pygame)
• simulations
Tuesday, March 30, 2010
GUIs pour Python
•
Parmi lesdifférentes bibliothèqeus graphiques utilisables dans Python
(GTK+, wxPython, Qt. . .), la bibliothèque Tkinter, issue du
langage tcl/Tk est très employée, car elle est installée de base dans toute les
distributions Python.
•
Tkinter facilite la construction de GUI (Graphic User Interface)
simples. Après l’avoir importé, il suffit de créer, configurer et positionner
les widgets utilisés, puis d’entrer dans la boucle principale de gestion des
événements.
Cordeau cours Python IUT Orsay
Tuesday, March 30, 2010
Organisation d’un
toolkit GUI
L’interface utilisateur d’un programme est généralement
construite hiérarchiquement en une cascade de widgets
ajoutés au dessus d’autres widgets.
La plupart des toolkits widgets utilisent la programmation
par événements pour gérer les interaction. Le toolkit traite
les événements utilisateurs, par exemple quand l’utilisateur
clique un bouton.
Quand un événement est détecté il est passé à l’application
où il est traité.
Tuesday, March 30, 2010
Deux styles de programmation
Deux
styles de programmation
Programmation
événementielle
En
programmation
graphique
objet,
on
remplace
le
déroulement
En
programmation
graphique
objet,
on
En programmation graphique objet, on remplace le déroulement
séquentiel
du
script
par
une
boucle
d’événements
:
remplace
le
déroulement
séquentiel
du
script
séquentiel du script par une boucle d’événements :
par une boucle d’événements :
112 / 135
112 /
Tuesday, March 30, 2010
Tk()
exemple!",
simple
= Label(base,Tkinter
text="Bienvenue
fg="red")
pack()
= Button(base,
text="Quit",
command=base.destroy)
from Tkinter import *
.pack()
base = Tk()
texte = Label(base, text="Bienvenue !", fg="red")
texte.pack()
ainloop()
bouton = Button(base, text="Quit", command=base.destroy)
bouton.pack()
base.mainloop()
Tuesday, March 30, 2010
widgets Tkinter (1)
•Tk fenêtre de plus haut niveau
•Frame contenant pour organiser d’autres widgets
•Label zone de message
•Button bouton avec texte ou image
•Message zone d’affichage multi-lignes
•Entry zone de saisie
•Checkbutton bouton à deux états
•Radiobutton bouton à deux états exclusifs
Tuesday, March 30, 2010
widgets Tkinter (2)
•Scale glissière à plusieurs positions
•PhotoImage sert à placer des images sur des widgets
•BitmapImage sert à placer des bitmaps sur des widgets
•Menu associé à un Menubutton
•Menubutton bouton ouvrant un menu d’options
• Scrollbar ascenseur
•Listbox liste de noms à sélectionner
•Text édition de texte multi-lignes
Tuesday, March 30, 2010
widgets Tkinter (3)
•Canvas zone de dessins graphiques ou de photos
•OptionMenu liste déroulante
•ScrolledText widget Text avec ascenseur
• PanedWindow interface à onglets
•LabelFrame contenant avec un cadre et un titre
• Spinbox un widget de s élection multiple
Tuesday, March 30, 2010
Tkinter: gestion de
la géométrie
Tkinter possède trois gestionnaires de positionnement :
Le packer : dimensionne et place chaque widget dans un
widget conteneur selon l’espace requis par chacun d’eux.
Le gridder : dimensionne et positionne chaque widget dans
les cellules d’un tableau d’un widget conteneur.
Le placer : dimensionne et place chaque widget w dans un
widget conteneur exactement selon ce que demande w. C’est
un placement absolu (usage peu fréquent).
Tuesday, March 30, 2010
Tkinter: hello world
# 1er exemple Tk
from Tkinter import *
# La "fenetre" (widget) racine
instance de la
root = Tk()
# Creation d'un champ de texte:
w = Label(root, text="Salut monde cruel !")
# Positionnement du champ:
w.pack()
# "Boucle" principale
root.mainloop()
http://www-gtr.iutv.univ-paris13.fr/Cours/Mat/Python/CoursTk
Tuesday, March 30, 2010
classe Tk
Tkinter: exemple 2
# Exemple simple de bouton Tk
from Tkinter import *
root = Tk()
instance de
def action():
print 'Bouton presse'
b = Button( root, text='Voici un bouton',
command=action )
b.pack()
root.mainloop()
>>>Bouton presse
http://www-gtr.iutv.univ-paris13.fr/Cours/Mat/Python/CoursTk
Tuesday, March 30, 2010
la classe Tk
Tkinter: exemple 3
# 2ieme exemple Tk
from Tkinter import *
class Application:
def __init__(self, parent):
# 1- Cree un widget "cadre"
frame = Frame(parent)
frame.pack()
# 2- Cree un bouton pour quitter
button = Button(frame, text="QUIT",
fg="red",
command=frame.quit)
button.grid(row=0)
# 3- Cree un bouton pour saluer...
salut = Button(frame, text="Salut !",
command=self.salutation)
salut.grid(row=1)
def salutation(self) # appele lorsqu'on appuie le bouton "salut"
print "Salut TOUS !"
# Creation de l'application:
root = Tk()
app = Application(root)
root.mainloop()
Opérateurs de
placement
>>>Salut TOUS !
Tuesday, March 30, 2010
Tkinter: exemple 3
# Exercice utilisant la bibliothèque graphique Tkinter et le module math
#G. Swinnen: Apprendre a programmer avec Python
from Tkinter import *
from math import *
méthode «get»
# définition de l'action à effectuer si l'utilisateur actionne du widget «entree»
# la touche "enter" alors qu'il édite le champ d'entrée :
def evaluer(event):
chaine.configure(text = "Résultat = " + str(eval(entree.get())))
# ----- Programme principal : ----méthode «configure»
fenetre = Tk()
Classe Entry
du widget «chaine»
entree = Entry(fenetre)
Widget «entree» (instance de «Entry»)
entree.bind("<Return>", evaluer)
chaine = Label(fenetre)
Evénement associé
entree.pack()
chaine.pack()
Widget
fenetre.mainloop()
«chaine» (instance)
de la classe «Label»
Tuesday, March 30, 2010
La programmation � OO � graphique
Les bibliothèques graphiques
positionnement
Les classes Le
de widgets
de Tkinter des widgets
Un exemple
Le positionnement
des widgets
Un exemple
Tkinter: exemple 4
� : programmation OO (4/4)
Saisie
�
Saisie : programmation OO (4/4)
Le
ouvre
deux
fenêtres.
On On
saisit
une
note...
Leprogramme
programme
ouvre
deux
fenêtres.
saisit
une
note...
Le
programme
ouvre
deux
fenêtres.
On
saisit
une
note...
...qui ...qui
est reportée
dans ladans
première
fenêtre.fenêtre.
est reportée
la première
...qui est reportée dans la première fenêtre.
Tuesday, March 30, 2010
Tkinter: exemple simple 4.1
L’en-tête et les imports (on utilise le module Pmw, Python Mega Widgets)
#!/bin/env python
# -*- coding: UTF-8 -*"""Programmation OO graphique."""
# auteur : Bob Cordeau
# imports
from Tkinter import *
from tkSimpleDialog import *
import Pmw
Tuesday, March 30, 2010
Tkinter: exemple simple 4.2
Définition d’une classe (que nous nommons «App») pour l’application
graphique.
# classes
class App:
def __init__(self, master):
self.result = Pmw.EntryField(master, entry_width=8,
value=’10’,
label_text=’Affichage retourné: ’,
labelpos=W, labelmargin=1)
self.result.pack(padx=15, pady=15)
Tuesday, March 30, 2010
Tkinter: exemple simple 4.3
Le programme principal
# programme principal ------------------------------------root = Tk()
display = App(root)
retVal = askinteger("Notes",
"Entrez votre note d’info :",
minvalue=0, maxvalue=50)
display.result.setentry(retVal)
root.mainloop()
Tuesday, March 30, 2010
Références
K. Hinsen
G. Swinnen, Apprendre à programmer avec
Python
http://www.voidspace.org.uk/python/articles/
oop_francais.shtml
Tkinter: http://www.iut-orsay.fr/dptmphy/
Pedagogie/coursPython.pdf
Tuesday, March 30, 2010
Téléchargement