• Aucun résultat trouvé

Introduction à la programmation orientée objet - Comment créer ses propres structures en Python ?

N/A
N/A
Protected

Academic year: 2021

Partager "Introduction à la programmation orientée objet - Comment créer ses propres structures en Python ?"

Copied!
52
0
0

Texte intégral

(1)

HAL Id: cel-02182422

https://hal.archives-ouvertes.fr/cel-02182422

Submitted on 12 Jul 2019

HAL is a multi-disciplinary open access archive for the deposit and dissemination of sci-entific research documents, whether they are pub-lished or not. The documents may come from teaching and research institutions in France or abroad, or from public or private research centers.

L’archive ouverte pluridisciplinaire HAL, est destinée au dépôt et à la diffusion de documents scientifiques de niveau recherche, publiés ou non, émanant des établissements d’enseignement et de recherche français ou étrangers, des laboratoires publics ou privés.

Introduction à la programmation orientée objet

-Comment créer ses propres structures en Python ?

Stéphane Guinard

To cite this version:

Stéphane Guinard. Introduction à la programmation orientée objet - Comment créer ses propres structures en Python ?. École d’ingénieur. France. 2018. �cel-02182422�

(2)

Introduction `

a la programmation orient´

ee

objet

Comment cr´eer ses propres structures en Python ?

(3)
(4)

Qu’est-ce que c’est ?

La programmation orient´ee objet consiste en la d´efinition et l’interaction de briques logicielles appel´ees objets ; un objet repr´esente un concept, une id´ee ou toute entit´e du monde physique, comme une voiture, une personne ou encore une page d’un livre. Il poss`ede une structure interne et un comportement, et il sait interagir avec ses pairs. Il s’agit donc de repr´esenter ces objets et leurs relations ; l’interaction entre les objets via leurs relations permet de concevoir et r´ealiser les fonctionnalit´es attendues, de mieux r´esoudre le ou les probl`emes.

(5)

Pour quoi faire ?

Qu’est-ce qu’un rectangle ?

• Objet dans l’espace • Poss`ede 4 sommets

• Chaque sommet a ses propres coordonn´ees X, Y, Z

• Poss`ede 4 cˆot´es • Cˆot´es sont 2 `a 2 ´egaux • Cˆot´es perpendiculaires

(6)

Pour quoi faire ?

Qu’est-ce qu’un rectangle ? • Objet dans l’espace • Poss`ede 4 sommets

• Chaque sommet a ses propres coordonn´ees X, Y, Z

• Poss`ede 4 cˆot´es • Cˆot´es sont 2 `a 2 ´egaux • Cˆot´es perpendiculaires

(7)

La POO c’est pas si nouveau

Quand on ajoute des ´el´ements `a une liste : > > > l . a p p e n d (" e l e m e n t ")

Quand on compte le nombre d’´el´ements (e.g. “a”) dans une chaˆıne de caract`eres :

> > > s . c o u n t ( a ) Quand on ouvre un fichier :

(8)

Principes de la POO

Il y a 4 principes fondamentaux dans la POO :

• H´eritage • Polymorphisme • Encapsulation • Abstraction

(9)
(10)

D´eclaration d’une classe

• Utilisation du mot-cl´e ‘class‘

c l a s s M a C l a s s e (o b j e c t) : ...

... • Convention :

• 1`ere lettre des mots en majuscule • pas d’espace, tiret, underscore... • MonNomDeClasse

(11)

Instanciation d’un objet

L’objet cr´e´e est une instance de classe. On en cr´ee autant que l’on veut.

> > > m o n _ o b j e t 1 = M a C l a s s e () > > > m o n _ o b j e t 2 = M a C l a s s e () > > > m o n _ o b j e t 3 = M a C l a s s e ()

> > > p r i n t( m o n _ o b j e t 1 is m o n _ o b j e t 2 ) F a l s e

(12)

Les m´ethodes

Une m´ethode est une fonction d´efinie `a l’int´erieur d’une classe. Pour l’utiliser on fait pr´ec´eder le nom de la m´ethode du nom de l’objet. > > > c l a s s M a C l a s s e (o b j e c t) : def u n e _ m e t h o d e ( p a r a m ) : p r i n t(" Une m ´e t h o d e qui f a i t q u e l q u e c h o s e ") > > > m o n _ o b j e t = M a C l a s s e () > > > m o n _ o b j e t . u n e _ m e t h o d e () Une m ´e t h o d e qui f a i t q u e l q u e c h o s e

(13)

Les m´ethodes

Instance appelant la m´ethode = 1er param`etre de la m´ethode • nomm´e self par convention

• sp´ecificit´e de Python > > > c l a s s M a C l a s s e (o b j e c t) : def u n e _ m e t h o d e ( s e l f ) : p r i n t( s e l f ) > > > m o n _ o b j e t = M a C l a s s e () > > > p r i n t( m o n _ o b j e t ) < _ _ m a i n _ _ . D e s c r i p t i o n D e L O b j e t o b j e c t at 0 x 0 5 9 F 0 1 9 0 > > > > m o n _ o b j e t . u n e _ m e t h o d e () < _ _ m a i n _ _ . D e s c r i p t i o n D e L O b j e t o b j e c t at 0 x 0 5 9 F 0 1 9 0 >

(14)

Les attributs

Un attribut est une variable d´efinie `a l’int´erieur d’une classe. Pour y acc´eder :

• on fait pr´ec´eder le nom de l’attribut du nom de l’instance • ou de self si on est dans la classe

> > > c l a s s M a C l a s s e (o b j e c t) : def a f f i c h e r ( s e l f ) : p r i n t( s e l f . u n _ a t t r i b u t ) > > > m o n _ o b j e t = M a C l a s s e () > > > m o n _ o b j e t . u n _ a t t r i b u t = 42 > > > m o n _ o b j e t . a f f i c h e r () 42 > > > u n _ a t t r i b u t # n ’ e x s i t e pas en d e h o r s de la c l a s s e N a m e E r r o r : n a m e ’ u n _ a t t r i b u t ’ is not d e f i n e d

(15)

Le constructeur

• C’est une m´ethode appel´ee lors de la cr´eation d’objets. • Elle permet d’initialiser les valeurs des attributs. • Nomm´e init . > > > c l a s s M a C l a s s e (o b j e c t) : def _ _ i n i t _ _ ( s e l f ) : s e l f . u n _ a t t r i b u t = " v a l e u r i n i t i a l e " p r i n t(" O b j e t cr ´e ´e . A t t r i b u t s i n i t i a l i s ´e s . ") > > > m o n _ o b j e t = M a C l a s s e () O b j e t cr ´e ´e . A t t r i b u t s i n i t i a l i s ´e s . > > > m o n _ o b j e t . u n _ a t t r i b u t " v a l e u r i n i t i a l e "

(16)

Le constructeur

Possibilit´e de passer des param`etres pour personnaliser les objets. > > > c l a s s M a C l a s s e (o b j e c t) : def _ _ i n i t _ _ ( self , v a l e u r ) : s e l f . u n _ a t t r i b u t = v a l e u r > > > m o n _ o b j e t = M a C l a s s e (" v a l e u r p e r s o n n a l i s ´e e ") > > > m o n _ o b j e t . u n _ a t t r i b u t " v a l e u r p e r s o n n a l i s ´e e "

(17)

Le constructeur

Le constructeur peut aussi avoir des valeurs par d´efaut. > > > c l a s s M a C l a s s e (o b j e c t) :

def _ _ i n i t _ _ ( self , v a l e u r =" v a l e u r par d ´e f a u t ") : s e l f . u n _ a t t r i b u t = v a l e u r > > > m o n _ o b j e t 1 = M a C l a s s e () > > > m o n _ o b j e t 1 . u n _ a t t r i b u t " v a l e u r par d ´e f a ut " > > > m o n _ o b j e t 2 = M a C l a s s e (" v a l e u r p e r s o n n a l i s ´e e ") > > > m o n _ o b j e t 2 . u n _ a t t r i b u t " v a l e u r p e r s o n n a l i s ´e e "

(18)

M´ethodes sp´eciales

Nous appelerons m´ethode sp´eciale une m´ethode ex´ecut´ee sans qu’on ai besoin de l’appeler explicitement.

• init () en est une.

• Leur nom commence et termine par .

• Utile pour personnaliser le comportement d’un objet.

Remarque

Pour chaque m´ethode sp´eciale, Python a un comportement par d´efaut. Vous n’avez donc pas besoin de toutes les red´efinir. Il faut se concentrer sur les m´ethodes sp´eciales dont on a besoin et ou le comportement par d´efaut de Python ne convient pas.

(19)

M´ethodes sp´eciales

Nous appelerons m´ethode sp´eciale une m´ethode ex´ecut´ee sans qu’on ai besoin de l’appeler explicitement.

• init () en est une.

• Leur nom commence et termine par .

• Utile pour personnaliser le comportement d’un objet.

Remarque

Pour chaque m´ethode sp´eciale, Python a un comportement par d´efaut. Vous n’avez donc pas besoin de toutes les red´efinir. Il faut se concentrer sur les m´ethodes sp´eciales dont on a besoin et ou le comportement par d´efaut de Python ne convient pas.

(20)

M´ethodes sp´eciales > > > c l a s s M a C l a s s e (o b j e c t) : def _ _ i n i t _ _ ( self , v a l e u r ) : s e l f . u n _ a t t r i b u t = v a l e u r > > > m o n _ o b j e t = M a C l a s s e (" 17 ") > > > p r i n t( m o n _ o b j e t ) < _ _ m a i n _ _ . M a C l a s s e o b j e c t at 0 x 0 5 1 D 5 D F 0 >

(21)

M´ethodes sp´eciales > > > c l a s s M a C l a s s e (o b j e c t) : def _ _ i n i t _ _ ( self , v a l e u r ) : s e l f . u n _ a t t r i b u t = v a l e u r def _ _ s t r _ _ ( s e l f ) : p r i n t(" I n s t a n c e de M a C l a s s e ( v a l e u r de u n _ a t t r i b u t = {}) ". f o r m a t( s e l f . u n _ a t t r i b u t ) > > > m o n _ o b j e t = M a C l a s s e (" 17 ") > > > p r i n t( m o n _ o b j e t ) I n s t a n c e de M a C l a s s e ( v a l e u r de u n _ a t t r i b u t = 17)

(22)

M´ethodes sp´eciales

Quelques m´ethodes sp´eciales :

• str () : appel´ee suite `a un : print(objet). • add () : pour pouvoir ´ecrire : objet1 + objet2. • eq () : permet de comparer deux objets : objet1 ==

objet2.

• ne () : permet de tester si deux objets sont diff´erents : objet1 != objet2.

• len () : pour pouvoir calculer la longueur d’un objet : len(objet).

(23)

Port´ee des objets

`

A quel moment la fonction del () (destructeur ) est-elle appel´ee ?

• quand on l’appelle explicitement

• lorsque le contexte local est d´etruit (par exemple `a la fin d’une fonction)

(24)

Port´ee des objets

`

A quel moment la fonction del () (destructeur ) est-elle appel´ee ?

• quand on l’appelle explicitement

• lorsque le contexte local est d´etruit (par exemple `a la fin d’une fonction)

(25)
(26)

L’h´eritage

(27)

L’h´eritage

(28)

L’h´eritage

(29)

L’h´eritage

• Principe permettant de cr´eer une classe `a partir d’une autre. • Nom de la classe m`ere entre paranth`eses lors de la d´efinition. • M´ethodes et attributs de la classe m`ere transmis `a la classe

fille. c l a s s C l a s s e M e r e (o b j e c t) : ... ... c l a s s C l a s s e F i l l e ( C l a s s e M e r e ) : ... ...

(30)

L’h´eritage > > > c l a s s C l a s s e M e r e (o b j e c t) : def u n e _ m e t h o d e ( s e l f ) : p r i n t(" Je s u i s d a n s la c l a s s e m `e re ") > > > c l a s s C l a s s e F i l l e ( C l a s s e M e r e ) : p a s s > > > C l a s s e F i l l e () . u n e _ m e t h o d e () Je s u i s d a n s la c l a s s e m `e re

(31)

L’h´eritage

Un objet de la classe fille peut appeler une m´ethode ou un attribut de la classe m`ere : > > > c l a s s C a n a r d (o b j e c t) : def _ _ i n i t _ _ ( s e l f ) : s e l f . c o u l e u r = " j a u n e " > > > c l a s s C a n a r d Y o d a ( C a n a r d ) : def _ _ i n i t _ _ ( self , c o u l e u r ) : C a n a r d . _ _ i n i t _ _ ( s e l f ) s e l f . c o u l e u r = c o u l e u r # A p p e l l e l ’ a t t r i b u t c o u l e u r d ´e f i n i d a n s la c l a s s e m `e re > > > C a n a r d . c o u l e u r ’ j a u n e ’ > > > C a n a r d Y o d a (" v e r t ") . c o u l e u r ’ v e r t ’

(32)
(33)

Le polymorphisme

Principe permettant de donner plusieurs d´efinitions `a une m´ethode. En programmation orient´ee objet, cela se traduit par :

• la possibilit´e de red´efinir une m´ethode d’une classe m`ere dans une classe fille

• le fait que Python se charge de trouver la bonne m´ethode `a utiliser

(34)

Le polymorphisme > > > c l a s s C l a s s e M e r e (o b j e c t) : def u n e _ m e t h o d e ( s e l f ) : p r i n t(" Je s u i s d a n s la c l a s s e m `e re ") > > > c l a s s C l a s s e F i l l e ( C l a s s e M e r e ) : def u n e _ m e t h o d e ( s e l f ) : p r i n t(" Je s u i s d a n s la c l a s s e f i l l e ") > > > C l a s s e M e r e () . u n e _ m e t h o d e () Je s u i s d a n s la c l a s s e m `e re > > > C l a s s e F i l l e () . u n e _ m e t h o d e () Je s u i s d a n s la c l a s s e f i l l e

(35)
(36)

L’encapsulation

Un arbre est compos´e de : • un tronc

• des branches • des brindilles • des feuilles

Quand on parle d’un arbre, on sait qu’il contient toutes ces parties mais on ne le d´etaille pas.

(37)

L’encapsulation

Un arbre est compos´e de : • un tronc

• des branches • des brindilles • des feuilles

Quand on parle d’un arbre, on sait qu’il contient toutes ces parties mais on ne le d´etaille pas.

(38)

L’encapsulation

Un arbre est compos´e de : • un tronc

• des branches • des brindilles • des feuilles

Quand on parle d’un arbre, on sait qu’il contient toutes ces parties mais on ne le d´etaille pas.

(39)

L’encapsulation

Principe visant `a cacher les d´etails de l’impl´ementation `a l’utilisateur : les attributs de chaque classe doivent ˆetre priv´es, c’est-`a-dire inaccessibles en dehors de la classe. En Python cette notion n’existe pas : tout est public. Par convention on ajoutera un “ ” avant chaque attribut pour faire comme s’il ´etait priv´e.

(40)

L’encapsulation

> > > c l a s s M a C l a s s e (o b j e c t) :

def _ _ i n i t _ _ ( self , valeur1 , v a l e u r 2 ) : s e l f . a t t r i b u t _ p u b l i c = v a l e u r 1 s e l f . _ a t t r i b u t _ p r i v e = v a l e u r 2

(41)

Lecture/´ecriture d’attributs

Comment lire/´ecrire les valeurs des attributs priv´es ?

On utilise des m´ethodes sp´ecifiques. On les appellent des getter (pour lire une valeur) et des setter (pour changer une valeur).

(42)

Lecture/´ecriture d’attributs

> > > c l a s s C a n a r d (o b j e c t) :

def _ _ i n i t _ _ ( self , couleur , t a i l l e ) : s e l f . _ c o u l e u r = c o u l e u r s e l f . _ t a i l l e = t a i l l e def g e t _ c o u l e u r ( s e l f ) : r e t u r n s e l f . _ c o u l e u r def s e t _ c o u l e u r ( self , c o u l e u r ) : s e l f . _ c o u l e u r = c o u l e u r > > > c a n a r d = C a n a r d (" j a u n e ", 5) > > > c a n a r d . s e t _ c o u l e u r (" v e r t ") > > > c a n a r d . g e t _ c o u l e u r () ’ v e r t ’

(43)
(44)

Id´ee g´en´erale

Ce que veut l’utilisateur : • Appuyer sur un bouton • Mettre de l’argent

• R´ecup´erer son soda/snack Ce que l’utilisateur ne voit pas :

• Interpr´etation de la commande • V´erification du paiement • Donner le soda/snack

(45)

Id´ee g´en´erale

Ce que veut l’utilisateur : • Appuyer sur un bouton • Mettre de l’argent

• R´ecup´erer son soda/snack

Ce que l’utilisateur ne voit pas : • Interpr´etation de la commande • V´erification du paiement • Donner le soda/snack

(46)

Id´ee g´en´erale

Ce que veut l’utilisateur : • Appuyer sur un bouton • Mettre de l’argent

• R´ecup´erer son soda/snack Ce que l’utilisateur ne voit pas :

• Interpr´etation de la commande • V´erification du paiement • Donner le soda/snack

(47)

Les classes abstraites

Une classe abstraite est une classe qui ne peut ˆetre instanci´ee. C’est une notion qui est difficile `a mettre en œuvre en Python.

(48)

Les classes abstraites

c l a s s M a C l a s s e A b s t r a i t e (o b j e c t) :

def _ _ i n i t _ _ ( self , param1 , p a r a m 2 . . . ) :

r a i s e N o t I m p l e m e n t e d E r r o r def m e t h o d e 1 ( self , p a r a m . . . ) : # m e t h o d e 1 est une m ´e t h o d e a b s t r a i t e r a i s e N o t I m p l e m e n t e d E r r o r def m e t h o d e 2 ( self , p a r a m . . . ) : # m e t h o d e 2 est une m ´e t h o d e c o n c r `e te : on l ’ i m pl ´e m e n t e ici

(49)

Les classes abstraites c l a s s A n i m a l (o b j e c t) : def _ _ i n i t _ _ ( s e l f ) : r a i s e N o t I m p l e m e n t e d E r r o r def m a n g e r () : # m e t h o d e a b s t r a i t e r a i s e N o t I m p l e m e n t e d E r r o r c l a s s C a n a r d ( A n i m a l ) : def _ _ i n i t _ _ ( self , c o u l e u r ) : s e l f . _ c o u l e u r = c o u l e u r def m a n g e r ( i n g r e d i e n t ) : # m e t h o d e c o n c r `e te ...

(50)

Diff´erences abstraction/encapsulation

Quelles sont les diff´erences entre abstraction et encapsulation ?

(51)

Diff´erences abstraction/encapsulation

Quelles sont les diff´erences entre abstraction et encapsulation ?

(52)

Diff´erences abstraction/encapsulation

Abstraction Encapsulation • G´en´eralisation • Structuration • Cache les donn´ees /

struc-tures pour mettre en avant les id´ees

• Cache les d´etails de l’impl´ementation

• Se concentrer sur ce que fait un objet et pas sur comment il le fait

• cache les d´etails / m´echanismes utilis´es par l’objet

Figure

Figure 1: Abstraction Figure 2: Encapsulation

Références

Documents relatifs

Écrire une fonction colonnes qui prend une liste de liste d’entiers m représentant une grille carrée et un entier a en paramètre et qui envoie le booléen True si la somme des

● Le code source est ensuite soit traduit vers un langage compréhensible par la machine (langage binaire), on parle de compilation, soit il est interprété par un interpréteur

● Pour qu'un programme affiche quelque chose, il faut qu'on lui dise, par exemple :.. print (''Hello

● Il faut aussi définir les fonctions que l’on utilise dans le programme. Typiquement on les met avant dans

● On peut résoudre ces problèmes en utilisant une liste pour stocker les données.. Les listes → un nouveau type. ● Quand on crée une liste l = [5,6,7], on obtient un nouveau type

● En fait dans le cas 1), on peut même faire une fonction qui ne renvoie rien → une procédure qui ne fait que modifier liste.. Un autre problème classique. ● Il faut faire

● Une matrice à n lignes et m colonnes peut être facilement représentée par une liste de taille n dont chaque élément est une liste d'entiers de taille m. ● Si on appelle

Les introduction à Python sont nombreuses sur le Web, et certaines sont de très bonne qualité :. — Le cours de Bob