Documente Academic
Documente Profesional
Documente Cultură
Cédric Buche
28 janvier 2014
Et la suite ... ?
Cycle Ingénieur ENIB - Tronc commun
Enseignants-chercheurs
Bosser Anne-Gwen Cours + Labo bosser@enib.fr
Desmeulles Gireg Cours + Labo desmeulles@enib.fr
Planning
Module : Programmation Orientée Objet — POO 2013
Responsable : Cédric Buche (CERV, bureau 30, tel : 02 98 05 89 66, email : buche@enib.fr) S4
UML — Classes 50
43
ctd cb 51
51
43 UML — Classes
ctd cb
44 Vacances
Toussaint
Types de contrôle
Contrôle d’attention
Contrôle de l’attention sur un cours particulier - QCM
Durée 5-10’
En fin de cours
Types de contrôle
Contrôle d’attention
Contrôle de l’attention sur un cours particulier - QCM
Durée 5-10’
En fin de cours
Types de contrôle
Contrôle d’attention
Contrôle de l’attention sur un cours particulier - QCM
Durée 5-10’
En fin de cours
Exemple de QCM
1. QCM titre 4
(a) réponse fausse 4.2
(b) réponse fausse 4.1
(c) réponse fausse 4.5
(d) réponse juste 4
(e) réponse fausse 4.3
(f) réponse fausse 4.4
2. QCM titre 1
(a) réponse juste 1
(b) réponse fausse 1.2
(c) réponse fausse 1.3
(d) réponse fausse 1.1
3. QCM titre 2
(a) réponse juste 2
(b) réponse fausse 2.1
(c) réponse fausse 2.2
4. QCM titre 3
(a) réponse juste 3
(b) réponse fausse 3.1
(c) réponse fausse 3.2
Notation QCM
Notation QCM
DS
Contrôle de synthèse
Contrôle des compétences acquises sur un demi-semestre
Durée 1h20
Concepts objet
UML
Et si je suis absent ?
à un ”Contrôle d’attention”
→ Je justifie mon abscence (certificat médical)
à un ”Contrôle de synthèse”
→ Je justifie mon abscence (certificat médical)
Rattrapage
Plan de la présentation
3 Encapsulation (1 UC)
4 Hiérarchie (1 UC)
3 Encapsulation (1 UC)
4 Hiérarchie (1 UC)
Cours 1 / Labo 2
Objectifs
Justifier le modèle objet
Notion de classe :
définition
constructeur
Notion d’objet :
instanciation
manipulation
Qualité du logiciel
Extensibilité :
faculté d’adaptation d’un logiciel aux changements de spécification.
simplicité de la conception
décentralisation
Réutilisabilité :
aptitude d’un logiciel à être réutilisé en tout ou en partie pour de
nouvelles applications.
Qualité du logiciel
Extensibilité :
faculté d’adaptation d’un logiciel aux changements de spécification.
simplicité de la conception
décentralisation
Réutilisabilité :
aptitude d’un logiciel à être réutilisé en tout ou en partie pour de
nouvelles applications.
Qualité du logiciel
Extensibilité :
faculté d’adaptation d’un logiciel aux changements de spécification.
simplicité de la conception
décentralisation
Réutilisabilité :
aptitude d’un logiciel à être réutilisé en tout ou en partie pour de
nouvelles applications.
Programmation procédurale
séparation entre code et données.
Variables (globales)
contiennent vos données
sont utilisées par des fonctions/procédures.
Fonctions
peuvent modifier une variable
peuvent passer cette variable à une autre fonction/procédure.
Programmation procédurale
séparation entre code et données.
Variables (globales)
contiennent vos données
sont utilisées par des fonctions/procédures.
Fonctions
peuvent modifier une variable
peuvent passer cette variable à une autre fonction/procédure.
Programmation procédurale
séparation entre code et données.
Variables (globales)
contiennent vos données
sont utilisées par des fonctions/procédures.
Fonctions
peuvent modifier une variable
peuvent passer cette variable à une autre fonction/procédure.
Exemple
1 ###########################################
2 # Version 1
3 # variables globales
4 ###########################################
5
6 num secu robert = 10573123456
7 nom robert = ” Robert ”
8 qualification robert = ” Technicien ”
9 lieu de travail robert = ” Biarritz ”
1 # robert
2 num secu robert = 10573123456
3 nom robert = ” Robert ”
4 qualification robert = ” Technicien ”
5 lieu de travail robert = ” Biarritz ”
6
7 # bernard
8 num secu bernard = 2881111001
9 nom be rnard = ” Bernard ”
10 qualification bernard = ” Ingenieur ”
11 lieu de travail bernard = ” Biarritz ”
12
13 # ...
1 ###########################################
2 # Version 2
3 # u t i l i s a t i o n de c o n t e n e u r s
4 ###########################################
5
6 t a b r o b e r t =[10573123456 ,
7 ” robert ” ,
8 ” Technicien ” ,
9 ” Biarritz ” ]
10 tab mickey =[14456464443 ,
11 ” mickey ” ,
12 ” Ingenieur ” ,
13 ” Brest ” ]
14 tab = [ ]
15 t a b . append ( t a b r o b e r t )
16 t a b . append ( t a b m i c k e y )
17 print tab [ 0 ] [ 0 ] # num s e c u robert
1 ###########################################
2 # Version 3
3 # s t r u c t u r a t i o n des donnees
4 ###########################################
5
6 c l a s s Employe :
7 num secu
8 nom
9 qualification
10 Lieu de travail
Classe
déclare les propriétés communes d’un ensemble d’objets
Exemple
La classe Voiture possède les propriétés suivantes (les attributs) :
couleur
puissance
Classe
déclare les propriétés communes d’un ensemble d’objets
Exemple
La classe Voiture possède les propriétés suivantes (les attributs) :
couleur
puissance
Classe → Objets
usine à partir de laquelle il est possible de créer des objets.
Classe → Objets
usine à partir de laquelle il est possible de créer des objets.
En pratique ...
1 # robert
2 e 1=Employe ( ) # o b j e t e1 : i n s t a n c e de la classe Employe
3 e 1 . num secu = 10573123456
4 e 1 . nom = ” Robert ”
5 e1 . q u a l i f i c a t i o n = ” Technicien ”
6 e1 . L i e u d e t r a v a i l = ” Biarritz ”
7
8 print ( e 1 . num secu ,
9 e 1 . nom ,
10 e1 . q u a l i f i c a t i o n ,
11 e1 . L i e u d e t r a v a i l )
12
13 # mickey
14 e 2=Employe ( ) # o b j e t e2 : i n s t a n c e de la classe Employe
15 e 2 . num secu = 14456464443
16 e 2 . nom = ” Mickey ”
17 e2 . q u a l i f i c a t i o n = ” Inge ”
18 e2 . L i e u d e t r a v a i l = ” Brest ”
En pratique ...
1 # norbert
2 e 3=Employe ( )
3
4 print ( e 3 . num secu , # ERREUR
5 e 3 . nom ,
6 e3 . q u a l i f i c a t i o n ,
7 e3 . L i e u d e t r a v a i l )
Constructeur
les attributs doivent êtres initialisées avec une valeur par
défaut
appel à une fonction particulière : le constructeur
En pratique ...
1
2 c l a s s Employe :
3 def init ( self ): # Constructeur de la classe Employe
4 s e l f . num secu = 000000000
5 s e l f . nom = ” no name ”
6 self . qualification = ” novice ”
7 self . Lieu de travail = ” Paris ”
En pratique ...
1 # norbert
2 e 3=Employe ( ) # creation de e3 : appel implicite de init de Employe
3
4 print ( e 3 . num secu , # OK !!!
5 e 3 . nom ,
6 e3 . q u a l i f i c a t i o n ,
7 e3 . L i e u d e t r a v a i l )
En pratique ...
1
2 c l a s s Employe :
3 def init ( self ,
4 le num secu ,
5 le nom ,
6 la qualification ,
7 le Lieu de travail ):
8
9 self . num secu = le num secu
10 self . nom = le nom
11 self . qualification = la qualification
12 self . Lieu de travail = le Lieu de travail
En pratique ...
En python,
→ init appelée implicitement à la création d’un
objet
→ le constructeur peut posséder plusieurs arguments
(en plus de self )
1
2 c l a s s Employe :
3 def init ( self ,
4 le num secu = 000000000 ,
5 le nom = ” no name ” ,
6 la qualification = ” novice ” ,
7 le Lieu de travail = ” Paris ” ) :
8
9 self . num secu = le num secu
10 self . nom = le nom
11 self . qualification = la qualification
12 self . Lieu de travail = le Lieu de travail
13
14
15 ############## P r o g r a m m e P r i n c i p a l #############
16
17 e 1 = Employe ( l e L i e u d e t r a v a i l = ” Brest ” )
Plan de la présentation
3 Encapsulation (1 UC)
4 Hiérarchie (1 UC)
Cours 2 / Labo 2
Objectifs
Classe :
Attributs
Méthodes
Constructeur / destructeur
Objet :
État
Comportement
Identité
Cours 2 / Labo 2
Objectifs
Classe :
Attributs
Méthodes
Constructeur / destructeur
Objet :
État
Comportement
Identité
Les classes
Je croyais qu’on allait apprendre à créer des objets,
pourquoi créer une classe ?
pour créer un objet, il faut d’abord créer une classe !
exemple : pour construire une maison,
besoin d’un plan d’architecte
→ classe = plan,
→ l’objet = maison.
→ ”Créer une classe”, c’est dessiner les plans de l’objet.
Les classes
Une classe est une sorte de moule à partir duquel sont générés les
objets.
génération
Une classe −−−−−−−−→ des objets
Les classes
Une classe est une sorte de moule à partir duquel sont générés les
objets.
génération
Une classe −−−−−−−−→ des objets
Les classes
Les classes
Classe — Objets
1 Classe
Abstraction
Définit une infinité d’objets instances
Classe — Objets
1 Classe
Abstraction
Définit une infinité d’objets instances
Classe — Objets
1 Classe
Abstraction
Définit une infinité d’objets instances
État
1 #### d e f i n i t i o n c l a s s e ######
2 class Voiture :
3 def init ( s e l f , v1=” nomarque ” , v2=” n o c o l o r ” , v3 = 0 ) :
4 s e l f . marque = v1
5 s e l f . c o u l e u r = v2
6 s e l f . r e s e r v e E s s e n c e = v3
7
8 ### O b j e t #####
9 homer mobile = Voiture ( )
10
11 ## E t a t
12 h o m e r m o b i l e . marque = ” pipo ”
13 homer mobile . c o u l e u r = ” rose ”
14 h o m e r m o b i l e . r e s e r v e E s s e n c e = 30
Attributs et variables
Attributs et variables
Attributs et variables
Comportement
démarrer
arrêter
freiner
...
Comportement
démarrer
arrêter
freiner
...
1 #### d e f i n i t i o n c l a s s e ######
2 class Voiture :
3 def init ( s e l f , v1=” nomarque ” , v2=” n o c o l o r ” , v3 = 0 ) :
4 s e l f . marque = v1
5 s e l f . c o u l e u r = v2
6 s e l f . r e s e r v e E s s e n c e = v3
7
8 def d e m a r r e r ( s e l f ) :
9 p r i n t ” j e demarre ”
10 def a r r e t e r ( s e l f ) :
11 print ” j e m' a r r e t e ”
12 ...
13 ### O b j e t #####
14 homer mobile = Voiture ( )
15
16 ## C o m p o r t e m e n t
17 homer mobile . demarrer ( )
18 homer mobile . a r r e t e r ( )
Comportement — État
homer mobile.démarrer()
ne marchera pas si
homer mobile.reserveEssence
== 0
Comportement — État
1 #### d e f i n i t i o n c l a s s e ######
2 class Voiture :
3 def init ( s e l f , v1=” nomarque ” , v2=” n o c o l o r ” , v3 = 0 ) :
4 s e l f . marque = v1
5 s e l f . c o u l e u r = v2
6 s e l f . r e s e r v e E s s e n c e = v3
7
8 def d e m a r r e r ( s e l f ) :
9 i f s e l f . reserveEssence > 0 :
10 p r i n t ” j e demarre ”
11 else :
12 p r i n t ” j e ne peux p a s d e m a r r e r ”
État : évolution
marque : pipo
couleur : rose
réserve d’essence :
30l
marque : pipo
couleur : rose
réserve d’essence :
25l
État : évolution
marque : pipo
couleur : rose
réserve d’essence :
30l
marque : pipo
couleur : rose
réserve d’essence :
25l
État : évolution
1 #### d e f i n i t i o n c l a s s e ######
2 class Voiture :
3 def init ( s e l f , v1=” nomarque ” , v2=” n o c o l o r ” , v3 = 0 ) :
4 s e l f . marque = v1
5 s e l f . c o u l e u r = v2
6 s e l f . r e s e r v e E s s e n c e = v3
7
8 def d e m a r r e r ( s e l f ) :
9 i f s e l f . reserveEssence > 0 :
10 p r i n t ” j e demarre ”
11 else :
12 p r i n t ” j e ne peux p a s d e m a r r e r ”
13
14 def r o u l e r ( s e l f , nbKm ) :
15 s e l f . r e s e r v e E s s e n c e = s e l f . r e s e r v e E s s e n c e − 5 *nbKm/ 1 0 0 ;
16
17
18 ####
19 homer mobile = Voiture ( )
20 homer m o b i l e . r e s e r v e E s s e n c e = 30
21 homer mobile . demarrer ( )
22 homer mobile . r o u l e r (100)
23 print homer mobile . r e s e r v e E s s e n c e
Identité
L’identité
est propre à l’objet et le caractérise
permet de distinguer tout objet indépendamment de son état
Voiture.1
Voiture.2
Identité
L’identité
est propre à l’objet et le caractérise
permet de distinguer tout objet indépendamment de son état
Voiture.1
Voiture.2
Identité
Voiture.1
0xb7d4e0ec
→ leur référence
print homer mobile
Voiture.2
0xb7d53eec
Construction
Construction
Construction
Construction
En pratique ...
1
2 c l a s s Complexe :
3 def init ( s e l f , r =0.0 , i =0.0):
4 self . reel = r
5 s e l f . img = i
6
7
8
9 ####### P r o g r a m m e p r i n c i p a l ########
10 c 1 = Complexe ( )
11 c 2 = Complexe ( 0 . 5 )
12 c 3 = Complexe ( 0 . 5 , 0 . 2 )
13 c 4 = Complexe ( i = 0 . 2 )
Destruction
En python,
→ la définition d’un destructeur n’est pas obli-
gatoire
Destruction
En python,
→ la définition d’un destructeur n’est pas obli-
gatoire
Destruction
En python,
→ la définition d’un destructeur n’est pas obli-
gatoire
En pratique ...
1
2 c l a s s Complexe :
3 def del ( self ):
4 p r i n t ” I 'm d y i n g ! ”
En python,
→ del appelée implicitement à la destruction d’un
objet
Garbage collector
Appel du destructeur ?
dans certains langages, un programme s’exécute en tâche de fond
afin de supprimer la mémoire associée à un objet
→ le ramasse miettes ou ”garbage collector”
En pratique ...
1 c l a s s Test :
2 def del ( self ):
3 p r i n t ” I am d y i n g ”
4
5
6
7 >>> t 1 = T e s t ( ) # une i n s t a n c e de Test e s t c r e e
8 >>> t 1 = None # t1 ne permet p l u s d ' a c c e d e r a l ' i n s t a n c e
9 I am d y i n g # e l l e est s u s c e p t i b l e d ' e t r e d e t r u i t e ce qui
10 >>> # a r r i v e instantanement i c i mais n ' e s t pas g a r a n t i
Plan de la présentation
3 Encapsulation (1 UC)
4 Hiérarchie (1 UC)
Cours 3 / Labo 3
Objectifs
Encapsulation
Régles d’encapsulation
1 c l a s s Compte :
2 def init ( self ):
3 s e l f . solde = 0 # solde nul
4
5 def affiche ( self ):
6 p r i n t ” Le s o l d e de v o t r e compte e s t de ” s e l f . solde
7
8
9 ######## P r o g r a m m e p r i n c i p a l #######
10 c = Compte ( )
11 c . affiche () # pourquoi pas
12 c . s o l d e = 1000000 # ben t i e n s !
Contrôle d’accés
Contrôle d’accés
En pratique ...
1 c l a s s Test :
2
3 def init ( s e l f , laValeurPublic , laValeurPrivee ) :
4 s e l f . valeurPublic = laValeurPublic
5 self . valeurPrivee = laValeurPrivee
6
7
8 def f 1 ( s e l f ) :
9 ...
10 def f2 ( self ):
11 ...
12
13
14 ######## P r o g r a m m e p r i n c i p a l ########
15 t1 = Test ( )
16
17 print t1 . v a l e u r P u b l i c # OK
18 print t1 . valeurPrivee # ERREUR
19
20 t1 . f1 ( ) # OK
21 t1 . f2 () # ERREUR
Contrôle d’accés
1 def d e b i t ( s e l f , laValeur ) :
2
3 if self . s o l d e − laValeur > 0 :
4 self . solde = self . s o l d e − laValeur
5 else :
6 p r i n t ( ”Compte b l o q u e ! ! ! ”)
En python,
→ le préfixe ” ” rend privé un attribut ou une
méthode
1 protéger
→ ne pas permettre l’accès à tout dès que l’on a une référence de
l’objet
2 masquer l’implémentation
→ toute la décomposition du problème n’a besoin d’être connue
du programmeur client
3 évolutivité
→ possibilité de modifier tout ce qui n’est pas public sans impact
pour le programmeur client
1 protéger
→ ne pas permettre l’accès à tout dès que l’on a une référence de
l’objet
2 masquer l’implémentation
→ toute la décomposition du problème n’a besoin d’être connue
du programmeur client
3 évolutivité
→ possibilité de modifier tout ce qui n’est pas public sans impact
pour le programmeur client
1 protéger
→ ne pas permettre l’accès à tout dès que l’on a une référence de
l’objet
2 masquer l’implémentation
→ toute la décomposition du problème n’a besoin d’être connue
du programmeur client
3 évolutivité
→ possibilité de modifier tout ce qui n’est pas public sans impact
pour le programmeur client
Régles
Régles à respecter
1 Rendre privés les attributs caractérisant l’état de l’objet
l’attribut
accesseurs
mutateurs
1 ################################
2 # Programme Python #
3 # Auteur : . . . . . #
4 # Date c r e a t i o n : . . . #
5 ################################
6
7 c l a s s X:
8
9 # −−− D o c u m e n t a t i o n −−−
10
11
12 # −−− C o n s t r u c t e u r et d e s t r u c t e u r −−−
13
14 # −−− M e t h o d e s p u b l i q u e s : Acces aux a t t r i b u t s −−−
15 # accesseurs
16 # mutateurs
17
18 # −−− M e t h o d e s publiques : O p e r a t i o n s −−−
19
20 # −−− M e t h o d e s p r i v e e s −−−
Documentation
Conception :
décrire la classe et ses fonctionnalités
Debuggage :
debrayer des parties de code, marquer des points douteux, signer un
correctif
Maintenance :
décrire les corrections/ajouts/retraits et les signer
→ Indispensable dans un code
description, pas des ”faut que j’aille prendre un café” . . .
Constructeur et destructeur
Constructeur
Définir l’état initial de l’objet
→ Initialisation des attributs définis dans la classe
Créer les objets dont l’existence est liée à celle de l’objet
Types de constructeur
par défaut, par recopie . . .
Destructeur
Détruire tous les objets créés par l’objet courant au cours de son
existence
Intérêt
1 class Voiture :
2 ”””
3 La c l a s s e V o i t u r e d e f i n i e p a r s a l a r g e u r
4 ”””
5 # −−− C o n s t r u c t e u r e t d e s t r u c t e u r
6 def init ( s el f , laValeur = 0):
7 self . l a r g e u r = laValeur
8
9 # −−− M e t h o d e s p u b l i q u e s : A c c e s aux attributs
10 # accesseurs
11 def g e t L a r g e u r ( s e l f ) :
12 return s e l f . largeur
13 # mutateurs
14 def s e t L a r g e u r ( s e l f , v a l u e ) :
15 self . l a r g e u r = value
16
17 # −−− M e t h o d e s p u b l i q u e s : Operations
18 def m e t t r e A J o u r ( s e l f ) :
19 ...
20
21 ####### O b j e t ########
22 vehicule1 = Voiture ( ) ;
23 vehicule1 . setLargeur (100) # L a r g e u r de l a v o i t u r e
24 v e h i c u l e 1 . mettreAJour ( ) # Mettons a jo u r l ' a f f i c h a g e
25 vehicule1 . setLargeur (150) # Changeons l a l a r g e u r de l a voiture
26 v e h i c u l e 1 . mettreAJour ( ) # Mettons a jo u r l ' a f f i c h a g e
Intérêt
1 def s e t L a r g e u r ( s e l f , v a l u e ) :
2 self . l a r g e u r = value
3 s e l f . mettreAJour ( )
4
5 ####### O b j e t ###################
6 vehicule1 = Voiture ( ) ;
7 vehicule1 . setLargeur (100) # L a r g e u r de l a v o i t u r e
8 # L ' a f f i c h a g e de l a v o i t u r e e s t automatiquement mis a j o u r dans l ' accesseur
9 vehicule1 . setLargeur (150) # Changeons l a l a r g e u r de l a voiture
10 # Encore une f o i s , i l n ' y a r i e n d ' a u t r e a f a i r e !
Intérêt
1 vehicule1 = Voiture ( ) ;
2 vehicule1 . setLargeur (100) # L a r g e u r de l a v o i t u r e
3 # On v e r i f i e q u e l a l a r g e u r e s t d a n s l e s l i m i t e s
4 i f v e h i c u l e 1 . g e t L a r g e u r ( ) < 100 : vehicule1 . setLargeur (100)
5 e l s e i f v e h i c u l e 1 . g e t L a r g e u r ( ) > 200 : v e h i c u l e 1 . s e t L a r g e u r ( 2 0 0 )
6 print v e h i c u l e 1 . g e t L a r g e u r ( ) # A f f i c h e : 1 0 0
7
8 vehicule1 . setLargeur (250) # Changeons l a l a r g e u r de l a v o i t u r e
9 i f v e h i c u l e 1 . g e t L a r g e u r ( ) < 100 : vehicule1 . setLargeur (100)
10 e l s e i f v e h i c u l e 1 . g e t L a r g e u r ( ) > 200 : v e h i c u l e 1 . s e t L a r g e u r ( 2 0 0 )
11 print v e h i c u l e 1 . g e t L a r g e u r ( ) # A f f i c h e : 2 0 0
Intérêt
1 def s e t L a r g e u r ( s e l f , v a l u e ) :
2 self . l a r g e u r = value
3
4 # l a r g e u r d o i t e t r e c o m p r i s e e n t r e 100 et 200
5 i f ( s e l f . getLargeur ( ) < 100) : self . l a r g e u r = 100
6 else i f ( s e l f . getLargeur ( ) > 200) : s e l f . l a r g e u r = 200
7
8 s e l f . mettreAJour ( )
9
10 ### O b j e t
11 vehicule1 = Voiture ( ) ;
12 vehicule1 . setLargeur (100) # L a r g e u r de l a v o i t u r e
13 # P l u s b e s o i n de v e r i f i e r que l a l a r g e u r e s t dans les limites , l ' accesseur le
14 print v e h i c u l e 1 . g e t L a r g e u r ( ) # A f f i c h e : 100
15
16 vehicule1 . setLargeur (250); # Changeons l a l a r g e u r de la voiture
17 print v e h i c u l e 1 . g e t L a r g e u r ( ) # A f f i c h e : 200
Plan de la présentation
3 Encapsulation (1 UC)
4 Hiérarchie (1 UC)
Héritage
Héritage
Exemple : Fichier
Il existe plusieurs sortes de fichier :
fichier binaire → FichierBinaire
fichier ASCII → FichierASCII
Héritage
La relation d’héritage
Principe
les caractéristiques des classes supérieures sont héritées par les
classes inférieures.
Mise en œuvre
les connaissances les plus générales sont mises en commun dans des
classes qui sont ensuite spécialisées par définitions de sous–classes
successives contenant des connaissances de plus en plus spécifiques.
Spécialisation
La spécialisation d’une classe peut être réalisée selon deux techniques :
1 l’enrichissement : la sous–classe est dotée de nouvelle(s)
méthode(s) et/ou de nouveau(x) attribut(s) ;
2 la surcharge : une (ou plusieurs) méthode et/ou un attribut hérité
est redéfini.
En pratique ...
En pratique ...
En pratique ...
En pratique ...
En pratique ...
1 c l a s s Engin :
2 def init ( s e l f , braquage =90):
3 self . vitesse = 0
4 self . bra quage = braquage
5
6 def v i r a g e ( s e l f ) :
7 return s e l f . vitesse / self . braquage
8
9 #−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
10 c l a s s S o u s m a r i n a l p h a ( Engin ) :
11 def init ( s e l f , braquage ) :
12 Engin . init ( s e l f , braquage )
13
14 #−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
15 c l a s s T o r p i l l e ( Engin ) :
16 def init ( s e l f , braquage ) :
17 Engin . init ( s e l f , braquage )
18
19 def e x p l o s e ( s e l f ) :
20 print ” E x p l o s i o n !!!!!!”
L’héritage multiple
faire hériter une classe de plusieurs superclasses.
regrouper au sein d’une seule et même classe les attributs et
méthodes de plusieurs classes.
En pratique ...
1
2 class Herbivore :
3 ...
4 def mangerHerbe ( s e l f ) :
5 p r i n t ” j e mange de l ' herbe ”
6
7 #−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
8 class Carnivore :
9 ....
10 def mangerViande ( s e l f ) :
11 p r i n t ” j e mange de l a v i a n d e ”
12 #−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
13 c l a s s Omnivore ( H e r b i v o r e , C a r n i v o r e ) : # Heritage multiple
14 ....
15 def manger ( s e l f ) :
16 i f rand (10)%2 == 0 :
17 s e l f . mangerHerbe ( )
18 else :
19 s e l f . mangerViande ( )
Polymorphisme
A un même service peut correspondre, dans les classes dérivées,
des méthodes différentes
Chaque classe dérivée définit le forme ( -morphe) sous laquelle elle
remplit le service (méthode)
Cette forme peut donc être multiple (différente d’une classe à
l’autre) ( poly-)
En pratique ...
1 c l a s s Shape : # classe ” abstraite ” specifiant une interface
2 def init ( self ):
3 p r i n t ” j e s u i s une s h a p e ”
4
5 def a r e a ( s e l f ) :
6 return ” s h a p e a r e a ”
7
8 c l a s s R e c t a n g l e ( Shape ) :
9 def init ( self ):
10 Shape . init ( self )
11 p r i n t ” j e s u i s un R e c t a n g l e ”
12
13
14 def a r e a ( s e l f ) :
15 return ” r e c t a n g l e area ”
16
17 c l a s s C i r c l e ( Shape ) :
18 def init ( self ):
19 Shape . init ( self )
20 p r i n t ” j e s u i s un c e r c l e ”
21 def a r e a ( s e l f ) :
22 return ” c i r l e area ”
23
24 #### p r o g r a m m e p r i n c i p a l
25 shapes = [ ]
26 s h a p e s . append ( R e c t a n g l e ( ) )
27 s h a p e s . append ( C i r c l e ( ) )
28 for i in shapes :
29 CédricpBuche
r i n t i(ENIB)
. area () POO
# appel p o l y m o r p h e 28 janvier 2014 92 / 137
Hiérarchie (1 UC) Hiérarchie
En python,
→ Les attributs et méthodes protégées sont accessibles
normalement, le préfixe a pour seul objectif d’informer
sur leur nature
En pratique ...
1 c l a s s Telephone :
2 def init ( self ):
3 # donnees prives
4 self . numero serie = ' 126312156 '
5
6 # donnees protegees
7 s e l f . c o d e p i n = ' 1234 '
8
9 # donnees publiques
10 s e l f . modele = ' n o k i a 6800 '
11 s e l f . numero = ' 06 06 06 06 06 '
En pratique ...
1 # methodes privees
2
3 # methodes p r o t e g e e s
4 def chercherReseau ( s e l f ) :
5 p r i n t ' Reseau FSR , b i e n v e n u e dans un monde m e i l l e u r ... '
6
7 def recupMessage ( s e l f ) :
8 p r i n t ' Pas de m e s s a g e '
9
10 # methodes p u b l i q u e s
11 def a l l u m e r ( s e l f , c o d e P i n ) :
12 p r i n t s e l f . modele
13 i f s e l f . c o d e p i n == c o d e P i n :
14 p r i n t ' Code p i n OK '
15 s e l f . chercherReseau ()
16 s e l f . recupMessage ( )
17 else :
18 p r i n t ' mauvais c o d e p i n '
En pratique ...
1
2 # programme p r i n c i p a l
3 nokia = Telephone ( )
4 n o k i a . a l l u m e r ( ' 1524 ' )
5 n o k i a . a l l u m e r ( ' 1234 ' )
En pratique ...
1 c l a s s TelephonePhoto ( Telephone ) :
2 def init ( self ):
3 Telephone . init ( self )
4 p r i n t ' t e l e p h o n e + mieux '
5
6 # methodes p u b l i q u e s
7 def p r e n d r e p h o t o ( s e l f ) :
8 p r i n t ' c l i k −c l a k '
9
10 # Test
11 def f o n c t i o n t e s t ( s e l f ) :
12 print s e l f . numero serie # ERREUR
13 print s e l f . c o d e p i n # OK s o u s − c l a s s e de Telephone
14
15
16 # programme p r i n c i p a l
17 nokia = TelephonePhoto ( )
18 n o k i a . a l l u m e r ( ' 1234 ' )
19 nokia . prendre photo ( )
En pratique ...
1 t e l s a g e m = Telephone ( )
2 print tel sagem . numero serie # ERREUR
3 print tel sagem . code pin # NON ! !
En pratique ...
1 # Relation multiple
2
3 class FilleMars :
4 def init ( s e l f , prenom ) :
5 self . p r e n o m = prenom
6
7 def a f f i c h e P r e n o m ( s e l f ) :
8 print s e l f . prenom
9 #−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
10 c l a s s PapaMars :
11 def init ( self ):
12 self . filles = []
13 self . f i l l e s . append ( F i l l e M a r s ( ' Pamela ' ) )
14 self . f i l l e s . append ( F i l l e M a r s ( ' Tina ' ) )
15 self . f i l l e s . append ( F i l l e M a r s ( ' Rebecca ' ) )
16 self . f i l l e s . append ( F i l l e M a r s ( ' Amanda ' ) )
17
18 def cri a table ( self ):
19 for c h i l d in s e l f . filles :
20 c h i l d . affichePrenom ()
21 print ( ' a t a b l e ! ! ! ' )
Héritage vs associations
classe Automobile à partir des classes Carrosserie, Siege, Roue et
Moteur.
l’héritage multiple == ERREUR
En pratique ...
1 # Relation simple
2 class Calculateur ( ) :
3 ””” c l a s s e de c a l c u l s ”””
4 def somme ( s e l f , a r g s = [ ] )
5 resultat = 0
6 for arg in a r g s :
7 r e s u l t a t += a r g
8 return r e s u l t a t
9 #−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
10 class Afficheur ( ) :
11 ””” c l a s s e de g e s t i o n de l ' i n t e r f a c e ”””
12 def init ( self ):
13 s e l f . calculateur = Calculateur ()
14
15 def somme ( s e l f , a r g s = [ ] ) :
16 r e s u l t a t = s e l f . c a l c u l a t e u r . somme ( a r g s )
17 p r i n t ' l e r e s u l t a t e s t %d ' % r e s u l t a t
Association simple
Objet arrêter
flic Wiggum
−−−−−→
Association simple
Objet arrêter
flic Wiggum
−−−−−→
1 #### d e f i n i t i o n c l a s s e ######
2 class Flic :
3 def init ( self ):
4 s e l f . nom
5
6 def d o n n e r O r d r e S t o p ( s e l f , v e h i c u l e ) : ## i n s t a n c e de Voiture
7 print ” a r r e t e t o i ! ! ”
8 vehicule . arreter ()
9
10 ### O b j e t #####
11 homer mobile = Voiture ( )
12 flic Wiggum = F l i c ( )
13 flic Wiggum . donnerOrdreStop ( homer mobile )
En pratique ...
1 c l a s s Roue :
2 def init ( self ):
3 p r i n t ”Me v o i c i !”
4
5 def del ( self ):
6 p r i n t ” Je meurs !”
7
8
9 class Voiture :
10 def init ( self ):
11 self . roue1 = Roue ( )
12 self . roue2 = Roue ( )
13 self . roue3 = Roue ( )
14 self . roue4 = Roue ( )
15
16 def del ( self ):
17 print ” I 'm d y i n g ! ”
18 del s e l f . roue1
19 del s e l f . roue2
20 del s e l f . roue3
21 del s e l f . roue4
En pratique ...
1 c l a s s Humain :
2 def init ( s e l f , nom ) :
3 s e l f . nom = nom
4
5 c l a s s Roue :
6 def init ( self ):
7 p r i n t ”Me v o i c i !”
8
9 def del ( self ):
10 p r i n t ” Je meurs !”
11
12 class Voiture :
13 def init ( self , proprio ) :
14 self . r o u e 1 = Roue ( )
15 self . r o u e 2 = Roue ( )
16 self . r o u e 3 = Roue ( )
17 self . r o u e 4 = Roue ( )
18 self . conducteur = proprio ( ”” )
19
20 def del ( self ):
21 print ” I 'm dying ! ”
22 del s e l f . roue1
23 del s e l f . roue2
24 del s e l f . roue3
25 del s e l f . roue4
Plan de la présentation
3 Encapsulation (1 UC)
4 Hiérarchie (1 UC)
Objectifs
Abstraction
Classification
Modularité
Typage
Simultanéité
Persistance
Abstraction
Un service peut être déclaré sans qu’une méthode y soit associée :
service abstrait
La méthode associée au service est définie dans une ou plusieurs
classes dérivées
On ne peut pas instancier d’objets d’une classe possédant un
service abstrait : classe abstraite
En pratique ...
1
2 class AbstractClass :
3
4 ...
5
6 # Force la c l a s s e f i l l e a d e f i n i r cette methode
7 def g e t V a l u e ( s e l f ) :
8 r a i s e NotImplementedError ( )
9
10 # m e t h o d e commune
11 def p r i n t O u t ( s e l f ) :
12 print s e l f . getValue ( ) ;
En pratique ...
Les mécanismes sont le moyen par lequel les objets collaborent pour
procurer un certain comportement de plus haut niveau [Booch, 1992]
Cédric Buche (ENIB) POO 28 janvier 2014 116 / 137
Pour aller plus loin Modularité
En pratique ...
Paquet en python
répertoire avec un fichier init .py qui définit les modules qu’il
contient (exemple : /usr/lib/python/xml/)
from paquetage
En pratique ...
Module en python
un fichier regroupant variables, classes et fonctions
extension ”.py”
from paquetage import Module
attention la liste path de sys
sys.path.append(Module)
En pratique ...
Typage
En pratique ...
1 def e s t P a i r ( nombre ) :
2 i f not i s i n s t a n c e ( nombre , int ):
3 return None
4 return ( nombre % 2 ) == 0
cycleVie()
cycleVie()
cycleVie()
En pratique . . .
1 import t h r e ad i n g
2 import time
3
4 c l a s s MyTimer :
5 def init ( s e l f , tempo , t a r g e t s = [ ] ) :
6 self . targets = targets
7 s e l f . t e m p o = tempo
8
9 def start ( self ):
10 self . t i m e r = t h r e a d i n g . Timer ( s e l f . tempo , self . run )
11 self . timer . start ()
12
13 def s t o p ( s e l f ) :
14 self . timer . cancel ()
15
16 def run ( s e l f ) :
17 for i in s e l f . targets :
18 i . cycleVie ()
En pratique . . .
1 ################################
2 # Programme p r i n c i p a l #
3 ################################
4
5 b o t s . append ( Animat2D ( ) )
6 b o t s . append ( Animat2D ( ) )
7
8 a = MyTimer ( 1 , b o t s )
9 a . start ()
En pratique ...
1 c l a s s Dummy:
2 def init ( self ):
3 s e l f . member1=” abcd ”
4 s e l f . member2=0
5 s e l f . member3=[ ' a ' , ' e ' , ' i ' , 'o ' , 'u ' ]
6
7
8 d1 = Dummy( )
9 p r i n t d1 . dict
10
11
12
13 ######### T e s t ##############
14 >>> python t e s t D i c . py
15 { ' member1 ' : ' abcd ' , ' member3 ' : [ 'a ' , ' e ' , ' i ' , 'o ' , 'u ' ], ' member2 ' : 0}
En pratique ...
En pratique ...
En pratique ...
1 class Persistent :
2
3 def init ( s e l f , id ) :
4 g l o b a l donnees
5 i f i d in donnees :
6 self . dict = donnees [ id ]
7 else :
8 s e l f . id = id
9 i n s t a n c e s . append ( s e l f )
10
11 def g e t I d ( s e l f ) :
12 return s e l f . i d
13
14
15 c l a s s MaClasse ( P e r s i s t e n t ) :
16
17 def init ( s e l f , i d , d a t a s = None ) :
18 Persistent . init ( s e l f , id )
19 i f d a t a s i s not None :
20 s e l f . datas = datas
En pratique ...
Utilisation
1
2 # programme p r i n c i p a l
3 i n s t a n c e d e = MaClasse ( ' 1 ' )
4 while True :
5 try :
6 i f hasattr ( instance de , ' datas ' ) :
7 instance de . datas = raw input ( ' valeur ( a c t u e l l e :% s ) : ' % instance de
8 else :
9 instance de . datas = raw input ( ' nouvelle valeur : ' )
10
11 except KeyboardInterrupt : # par exemple ” C o n t r o l −C”
12 print ' f i n '
13 sys . exit (0)
En pratique ...
Execution
1 >>> python t e s t P e r s i s t a n c e . py
2 chargement . . .
3 n o u v e l l e v a l e u r : homer
4 v a l e u r ( a c t u e l l e : homer ) : f i n
5 sauvegarde . . .
6
7 >>> python t e s t P e r s i s t a n c e . py
8 chargement . . .
9 v a l e u r ( a c t u e l l e : homer ) : b a r t
10 valeur ( a c t u e l l e : bart ) : f i n
11 sauvegarde . . .
12
13
14 >>> python t e s t P e r s i s t a n c e . py
15 chargement . . .
16 valeur ( a c t u e l l e : bart ) : l i s a
17 valeur ( actuelle : l i s a ) : fin
18 sauvegarde . . .
Références
Booch, G. (1992).
Conception orientée objets et applications.
Addison-Wesley.
Brooks, F. (1987).
No silver bullet - essence and accidents of software engineering.
IEEE Computer, 20(4) :10–19.
Peter, L. (1986).
The peter pyramid.
New York, NY :William Morrow.
Informatique S4
Cédric Buche
buche@enib.fr www.enib.fr/˜buche
28 janvier 2014