Vous êtes sur la page 1sur 32

Programmation Orientée Objets sous Python

Plan

1 Contexte

2 Exemple

3 Principes : Classe – Constructeur – Polymorphisme – Héritage – Redéfinition

4 Application

2
Contexte
C’est un paradigme de programmation.
✓Inventé dans les années 1960.
✓Omni présent aujourd’hui (Python, OCaml, PHP, Java, Javascript,
C++, Objective C).

Apport algorithmique:
✓Absolument aucun.
✓Ce n’est pas l’objectif.
Objectifs →Des programmes : corrects, faciles àécrire , faciles à maintenir
(relire et modifier)

3
Paradigme procédural
Exemple type : Pascal classique (Turbo Pascal 3.0)
D’un côté les données (variables globales).
De l’autre les procédures.
Limites:
Séparation souvent non naturelle.
Paradigme orienté objets
Réaction aux limitations du paradigme procédural :
Chaque entité pertinente est un objet.
Objet = données (attributs) + procédures (méthodes)

4
Exemple

Manipulations d’objets géométriques dans le plan


Objets considérés : disques, carrés, points.
Opérations à implanter : calcul du périmètre de l’aire, appartenance
d’un point à un disque ou à un carré.
Présentation en Python :
De façon procédurale.
Puis de façon orientée-objet.

5
Solution procédurale

Un code procédural typique :


from o u t i l s _ g e o me t r i q u e s i mp o r t *
a = (2 , 3)
c = ( a , 7)
p = p e r i me t r e ( c )
pr i n t ( e s t _ i n t e r i e u r ( ( 5, 6 ) , c ))
pr i n t ( c [ 0 ])

Plutôt obscure…

6
Implantation : outils_geometriques.py.

from math i mp o r t pi , s q rt
d e f norme ( v ) :
r e t ur n s q r t ( v [ 0 ] * * 2 + v [ 1] * *2 )
def d i s t a n c e ( p 1 , p 2 ) :
v = ( p1[0] − p2 [ 0 ] , p1 [ 1] − p2 [ 1] )
r e t u r n norme ( v )
def p e r i me t r e ( d i s q u e ) :
r e t u r n 2 * p i * d i s q u e [ 1]
def e s t _ i n t e r i e u r ( A, d i s q u e ) :
r e t ur n d i s t a n c e ( A, d i s q u e [ 0 ] ) < d i s q u e [ 1]

Détails d’implantation nuisibles à la lecture.


7
Solution Orientée Objets

Introduction de fonction auxiliaire :


Constructeurs pour construire les objets (par exemple un disque).
On manipule les données par l’intermédiaire des constructeurs.

8
Implantation de la classe Disque

c l a s s Disque :
de f _ _ i n i t _ _ ( d , c , r ) :
if (r >= 0):
d . c en t r e= c
d . r a yo n = r
def p e r i me t r e ( d ) :
r e t u r n 2 * p i * d . r a yo n
def a i r e ( d ) :
r e t u r n p i * d . r a yo n * * 2
def c o n t i e n t ( d , A ) :
r e t ur n d i s t a n c e ( A , d . c e n t r e) < d . r a yon

9
Implantation : Constructeurs
c l a s s Disque
Le nom d’une classe commence par une majuscule (par convention).

de f _ _ i n i t _ _ ( d , c e n t re , r a yo n ) :

Méthode spéciale appelée constructeur. Quand on évalue Disque(C , R),


Python :
construit un objet o contenant les méthodes de Disque et aucun
attribut;
exécute _ _ i n i t _ _ (o, C, R);
retourneo.

10
Implantation :
fonctions
def p e r i m e t r e ( d i s q u e ) :
r e t u r n 2 * p i * d i s q u e . r a yo n

def c o n t i e n t ( A, d i s q u e ) :
r e t ur n d i s tan c e (A,disque .c e n t r e )<disque .r a y o n

Bilan
✓Manipulation des disques plus claire (fonctions nommées)
✓Point faible éventuel : print ( c ) montre l’implantationconcrète.

11
Utilisation
a = ( 2 , 3)
c= D isq ue ( c e n t r e =a ,rayon =7)
pr i n t ( c . p e r i m e t r e ( ))
pr i n t ( c . c o n t i e n t ( ( 5 ,6 ) ) )
pr i n t ( c . c e n t r e)
✓Fonction disque → constructeur de la classe Disque. Permet de
contruire des instances de la classe.
✓Fonctions perimetre et contient → méthodes de la classe Disque.
✓Fonctions rayon et centre →attributs des disques.

12
Implantation

Les fonctions norme et distance restent inchangées :


from math i mp o r t s q rt , pi

d e f norme ( v ) :
r e t ur n s q r t ( v [ 0 ] * * 2 + v [ 1] * * 2)

def d i s t a n c e ( p 1 , p 2 ) :
v=( p1[0] − p2 [ 0 ] , p1 [ 1] − p2 [ 1] )
r e t u r n norme ( v )

13
Remarques

def p e r i me t r e ( d) :
def a i r e ( d ) :
def c o n t i e n t ( d , a ) :

Premier paramètre des méthodes (d) :


Objet sur lequel on applique la méthode :
l’évaluation de o .perimetre() appelle en fait perimetre( o ).
l’évaluation de o .contient(a) appelle en fait contient( o ,a).
Noté self (convention) :
def p e r i me t r e ( se l f ) :
r e t u r n 2 * p i * s e l f . r a yon

14
Polymorphisme

En procédural pas deux fonctions différentes avec le même nom.


En POO deux classes différentes peuvent avoir des méthodes de
même nom.

Polymorphisme : des objets de types différents peuvent


être manipulés de la même façon.

15
Exemple : ajoutons une classe des carrés

c l a s s C ar r e :
” ” ” Un c a r r é est mo d é l i s é par s o n c e n t r e
e t un c o i n ” ” ”
d e f _ _ i n i t _ _ ( s e l f , c e n t r e , c o i n) :
se l f . c e n t r e = c e n t r e
se l f . c o i n = c o i n
d e f c o t e (s e l f ) :
r e t ur n s q r t ( 2) * d i s t a n c e ( s e l f . c e n t re, s e l f. c o i n )
def p e r i me t r e ( s e l f ) :
r e t u r n 4 * s e l f . c o t e( )
def a i r e ( s e l f ) :
r e t ur n s e l f . c o t e ( ) * * 2

16
Utilisation

b =( 4 , −5)
c = C ar r e ( a, b )
pr i n t ( c . p e r i me t r e ( ) )
pr i n t ( c . a i r e () )

Et on peut encore manipuler les disques :


d=Disque ( a , 8 )
pr i n t ( d . p e r i me t r e ( ) )
pr i n t ( d . a i r e () )

17
Polymorphisme

c.perimetre( ) méthode de l’objet c donc de la classe Carre.


d.perimetre( ) méthode de l’objet d donc de la classe Disque.

En programmation procédurale : espace des noms plat.


En POO : structuration par les classes.

18
Exemple

Question Fonction sur les disques ou sur les carrés ?

def p e r i me t r e _ c a r r e _ s u r _ a i r e ( f ) :
” ” ” C a l c ul e l e r a p p o rt p é r i mè t re au c ar r é
sur a i r e p ou r l a f i g ur e f ” ””
r e t u r n f . p e r i me t r e ( ) * * 2 / f . a i r e ( )

19
Exemple

Question Fonction sur les disques ou sur les carrés ?

def p e r i me t r e _ c a r r e _ s u r _ a i r e ( f ) :
” ” ” C a l c ul e l e r a p p o rt p é r i mè t re au c ar r é
sur a i r e p ou r l a f i g ur e f ” ””
r e t u r n f . p e r i me t r e ( ) * * 2 / f . a i r e ( )

Réponse Fonction sur les disques et sur les carrés !

20
En Python : Tout est objet

Polymorphisme utilisé en python :


Pour la conversion en chaîne :
✓str (utilisée par print) appelle la méthode _ _ str _ _ del’objet.
✓repr (utilisé par le toplevel pour l’affichage ) appelle __ repr _ _

21
Exemple
Ajout d’une méthode _ _ repr _ _à Disque :
c l a s s Disque :
# .. .
de f _ _ r e p r _ _ ( se l f ) :
r e t u r n ” D i s q u e ( ” + str ( s e l f . c e n t r e )
+ ” , ” + str ( s e l f . r a yo n ) + ” ) ”
Utilisation :
a = (2 , 3)
c = D i s q u e ( c e n t r e =a , rayon =7)
pr i n t ( c )
pr i n t ( Disque ( ( 2 , 3) ,7) )

22
Méthodes _ _add_ _ , _ _getitem_ _ , _ _call_ _ …
Addition:
appel de la méthode _ _add_ _
permet d’utiliser + entre entiers, chaînes de caractères, listes, etc.

Notation t [ i ] :
appel de la méthode _ _getitem_ _
permet la même notation pour indices de listes, recherche dans un
dictionnaire, matrices,etc.
Notation f ( x ) :
appel de la méthode _ _call_ _
exemple : on peut définir une classe polynôme et écrire P(42) où P
est polynôme.
23
Étendre une classe

Supposons qu’on veut écrire une classe Carre2


ayant les mêmes méthodes que Carre
plus une méthode pour donner le disque circonscrit.

24
Premièreversion

c l a s s C ar r e 2 :
. . . ( c o p i e r − c o l l e r d e l a c l a s s e C a r r e)
d ef d i s q u e _ c i r c o n s c r i t ( s e l f ) :
d = di st an c e ( s e l f . c e n t r e , s e l f . c o i n )
r e t u r n D i sq u e ( se l f . c e n t r e , d)
d = C a r r e 2 ( a , b)
pr i n t ( d . d i s q u e _ c i r c o n s c r i t ( ) )

Critique :
Copier-coller inélégant.
Si on trouve un bug dans Carre, il faut le corriger dans Carre et
Carre2.
25
Notion d’héritage

En POO (dans les langages à classes), on peut demander à une classe d’hériter des
méthodes d’une autre classe.
En Python :
c l a s s C ar r e 2 ( C ar r e ) :
def d i s q u e _ c i r c o n s c r i t ( s e l f ) :
d = di st an c e ( s e l f . c e n t r e , s e l f . c o i n )
r e t u r n D i sq u e ( se l f . c e n t r e , d )
d = C a r r e 2 ( a , b)
pr i n t ( d . d i s q u e _ c i r c o n s c r i t ( ) )
pr i n t ( d . p e r i me t r e () )

26
Partage de code entre classes

On a défini une fonction perimetre_carre_sur_aire. Et si on voulait plutôt en


faire une méthode?
c l a s s F i gu r e ( ) :
def p e r i me t r e _ c a r r e _ s u r _ a i r e ( s e l f ) :
r e t ur n s e l f . p e r i me t r e ( ) / s e l f . a i r e ( )

c l a s s C a r r e ( F i gu r e ) :
...

c l a s s D i s q u e ( F i gu r e ) :
...

27
Redéfinition de méthodes

On veut une classe DebugCarre, qui affiche un message à chaque fois


qu’on fait un appel à la méthode perimetre.
On peut redéfinir la méthode perimetre pour cela :
c l a s s DebugCarre ( Carre ) :
def p e r i me t r e ( s e l f ) :
p r i n t ( ” me thod e p e r i me t r e ap p e l é e ” )
r e t u r n 4 * se l f . c o t e ( )

28
Le mot-clé super

On a encore fait du copier-coller !


Situation typique : on veut redéfinirune méthode en la modifiant légèrement.
super( ) retourne une version de l’objet dans laquelle les méthodes sont celles
des classes dont on hérite :

c l a s s DebugCarre ( Carre ) :
def p e r i me t r e ( s e l f ) :
p r i n t ( ” me thod e p e r i me t r e a p p e l é e ” )
r e t ur n s u p e r ( ) . p e r i me t r e ( )

29
Application -- objectifs

Écrireune classe Polynome des polynômes modélisant les polynômes


à coefficients entiers.
P(x) doit évaluer la valeur de P en x.
P[k] doit donner le coefficient du monôme de degré k.
P+Q doit retourner la somme des polynômes P et Q.

30
Application -- énoncé
1 Écrire une classe Polynome avec un constructeur prenant pour argument la
liste des coefficients.
2 Ajoutezune méthode __repr__. Par exemple,pour le polynôme
3X 4 − 7X 3 + 2, on obtiendra 3*X**4 + (-7)*X**3 + 0*X**2
+ 0*X**1 + 2*X**0. Vérifier que Python affiche alors bien les polynômes
quevous construisez.
3 Ajoutez une méthode eval permettant d’évaluer la valeur du polynôme en
un point. Une fois que la méthode marche, renommez-là __c a l l __ et
vérifiezqu’après avoir définiun polynôme P, vouspouvezcalculer P(5).

4 Ajoutez une méthode coeff permettant d’obtenir le coefficient du degré n de


votre polynôme. Renommez coeff en __getitem __ pour écrire
P [ i ] plutôt que P.coeff(i).

31
Application -- énoncé

5 Ajoutez une méthode pour effectuer la somme de deux polynômes. Renommez-la


__add __et vérifiezque vousêtesen mesurede faire la somme de deux polynômes
P et Q avec lasyntaxeP + Q.
6 Idemavecla multiplication.
7

32

Vous aimerez peut-être aussi