Programmation Orientée Objets 1 Introduction 2

publicité
Python 16 POO
Programmation Orientée Objets
1
Introduction
La programmation orientée objet (POO) permet de créer des entités (objets) que l’on peut manipuler. La programmation orientée objet impose des structures solides et claires. Les objets peuvent interagir entre eux, cela
facilite grandement la compréhension du code et sa maintenance. On oppose souvent la programmation objet à
la programmation procédurale, la première étant plus "professionnelle" que l’autre car plus fiable et plus propre.
Nous savions définir nos fonctions ; Python et nombre de langages vont plus loin. Il s’agit ici de définir non plus
une fonction, mais un objet.
«Mais alors. . .Qu’est-ce qu’un objet ?»
Les objets sont omniprésents en Python, string, int, float ...(qui sont alors dits natifs, c’est à dire par défaut
dans Python), mais libre à nous d’en créer davantage !
Un objet se présente de la façon suivante :
• Initialisé par ses attributs
• Caractérisé ensuite par des actions appelées méthodes
2
Première application
Explicitons l’exemple ci-dessous :
from math import *
class Point(object) :
def __init__(self, coordx, coordy, coordz) :
self.x=coordx
self.y=coordy
self.z=coordz
self.type="Point"
def distance(self,pt) :
#définit une méthode (ou fonction) pour les objets de cette classe
dist = math.sqrt((self.x-pt.x)**2+(self.y-pt.y)**2+(self.z-pt.z)**2)
return dist
L’outil Class permet de définir, comme son nom l’indique (en français «catégorie»), un ensemble d’objets.
Ici, la class Point définit . . .un point !
__init__ : est la notation utilisée pour définir les attributs de la class,
elle prend en arguments SELF (elle-même) puis ses attributs (tous ou une partie seulement).
Self : «C’est Lui !». . .Certes, mais encore. Self désigne l’objet, c’est pourquoi dans l’initialisation nous attribuons à self des caractéristiques. Ici self recevra les caractéristiques d’un point comprenant une composante
sur x, y et z.
Ensuite, les méthodes !
A présent, nous avons notre point. Allons plus loin, la Méthode «distance» retourne la distance entre deux
points déjà existants. La syntaxe est celle d’une fonction ordinaire.
Cours Info
- Jacques Delfaud -
Page 1 sur 6
Python 16 POO
Notons que les méthodes sont facultatives, contrairement à l’initialisation.
Utilisons tout ceci :
A=Point(1,2,3)
# Retourne un Point de coordonnées (1,2,3)
print(A.x)
# donne la première coordonnée de A
B=Point( 24 , 27, 29 )
print(A.distance(B))
# donne la distance de A à B
print(A.type)
# A est un Point
Etudions maintenant tout ceci plus en détail.
3
Les classes
Une classe regroupe des fonctions et des attributs qui définissent un objet. On appelle par ailleurs les fonctions
d’une classe des "méthodes".
Créons une classe Voiture :
class Voiture :
def__init__(self) :
self.nom = "Ferrari"
Notre classe Voiture est une sorte d’usine à créer des voitures.
La méthode def__init__ est appelée lors de la création d’un objet.
self.nom est une manière de stocker une information dans la classe. On parle d’attribut de classe. Dans notre
cas, on stock le nom dans l’attribut nom.
4
Les objets
Un objet est une instance d’une classe. On peut créer autant d’objets que l’on désire avec une classe.
Créons maintenant notre voiture :
ma_voiture = Voiture()
5
Les attributs de classe
Les attributs de classe permettent de stocker des informations au niveau de la classe. Elle sont similaires aux
variables.
Dans notre exemple :
ma_voiture = Voiture()
ma_voiture.nom
Donne : ’Ferrari’
Vous pouvez à tout moment créer un attribut pour votre objet :
ma_voiture.modele = "250"
Cours Info
- Jacques Delfaud -
Page 2 sur 6
Python 16 POO
Et le lire ainsi :
ma_voiture.modele
qui donne : ’250’
6
Les méthodes
Les méthodes sont des fonctions définies dans une classe.
Créons une nouvelle méthode dans notre classe voiture :
class Voiture :
def__init__(self) :
self.nom = "Ferrari"
def donne_moi_le_modele(self) :
return "250"
Utilisons cette méthode :
ma_voiture=Voiture()
ma_voiture.donne_moi_le_modele()
donne : ’250’
7
Les propriétés
Quelque soit le langage, pour la programmation orientée objet il est de préférable de passer par des propriétés
pour changer les valeurs des attributs. Alors bien que cela ne soit pas obligatoire, il existe une convention de
passer par des getter (ou accesseur en francais) et des setter (mutateurs) pour changer la valeur d’un attribut.
Cela permet de garder une cohérence pour le programmeur, si je change un attribut souvent cela peut également
impacter d’autres attributs et les mutateurs permettent de faire cette modification une fois pour toute.
Un exemple d’utilisation de propriétés :
class Voiture(object) :
def__init__(self) :
self._roues=4
def_get_roues(self) :
print "Récupération du nombre de roues"
return self._roues
def_set_roues(self, v) :
print "Changement du nombre de roues"
self._roues = v
roues=property(_get_roues, _set_roues)
Quand on changera la valeur du nombre de roues, un message apparaîtra. En soi cela n’apporte rien mais au
lieu de faire un simple print, vous pouvez par exemple envoyer un mail, etc...
Testons notre classe :
ma_voiture=Voiture()
ma_voiture.roues=5
Cours Info
- Jacques Delfaud -
Page 3 sur 6
Python 16 POO
Changement du nombre de roues :
ma_voiture.roues
Récupération du nombre de roues : 5
8
L’héritage de classe
L’héritage est un concept très utile. Cela permet de créer de nouvelles classes mais avec une base existante.
Gardons l’exemple de la voiture et créons une classe VoitureSport :
class Voiture :
roues = 4
moteur = 1
def__init__(self) :
self.nom = "A déterminer"
class VoitureSport(Voiture) :
def__init__(self) :
self.nom = "Ferrari"
On a indiqué que VoitureSport a hérité de classe Voiture, elle récupère donc toutes ses méthodes et ses attributs.
On peut toujours instancier la classe Voiture si on le désire :
ma_voiture=Voiture()
ma_voiture.nom
donne : ’A déterminer’
ma_voiture.roues
donne : 4
Instancions maintenant la classe VoitureSport :
ma_voiture_sport=VoitureSport()
ma_voiture_sport.nom
donne : ’Ferrari’
ma_voiture_sport.roues
donne : 4
On remarque tout d’abord que l’attribut roues a bien été hérité.
Ensuite on remarque que la méthode __init__ a écrasé la méthode de la classe Voiture. On parle alors de
surcharge de méthode.
Cours Info
- Jacques Delfaud -
Page 4 sur 6
Python 16 POO
9
Polymorphisme / surcharge de méthode
Comme nous l’avons vu plus haut si une classe hérite d’une autre classe, elle hérite les méthodes de son parent.
Exemple :
class Voiture :
roues = 4
moteur = 1
def__init__(self) :
self.nom = "A déterminer"
def allumer(self) :
print "La voiture démarre"
class VoitureSport(Voiture) :
def__init__(self) :
self.nom = "Ferrari"
ma_voiture_sport = VoitureSport()
ma_voiture_sport.allumer()
Cela nous donne :
La voiture démarre
Il est cependant possible d’écraser la méthode de la classe parente en la redéfinissant. On parle alors de surcharger une méthode.
class Voiture :
roues = 4
moteur = 1
def__init__(self) :
self.nom = "A déterminer"
def allumer(self) :
print "La voiture démarre"
class VoitureSport(Voiture) :
def__init__(self) :
self.nom = "Ferrari"
def allumer(self) :
print "La voiture de sport démarre"
ma_voiture_sport = VoitureSport()
ma_voiture_sport.allumer()
Cela nous donne :
La voiture de sport démarre
Enfin, dernier point intéressant : il est possible d’appeler la méthode du parent puis de faire la spécificité de la
méthode. On peut d’ailleurs appeler n’importe quelle autre méthode.
Cours Info
- Jacques Delfaud -
Page 5 sur 6
Python 16 POO
Exemple :
class Voiture :
roues = 4
moteur = 1
def__init__(self) :
self.nom = "A déterminer"
def allumer(self) :
print "La voiture démarre"
class VoitureSport(Voiture) :
def__init__(self) :
self.nom = "Ferrari"
def allumer(self) :
Voiture.allumer(self)
print "La voiture de sport démarre"
ma_voiture_sport = VoitureSport()
ma_voiture_sport.allumer()
Ce qui nous donne :
La voiture démarre
La voiture de sport démarre
Les classes Voiture et VoitureSport possèdent donc chacune une méthode de même nom mais ces méthodes
n’effectuent pas les mêmes tâches. On parle dans ce cas de polymorphisme.
10
Conventions
En Python, peu de choses sont forcées. La plupart des choses sont des conventions. Mais ce sont des conventions
fortes, les gens y tiennent.
Parmi ces conventions, il y a les conventions de nommage, à savoir :
• On nomme les classes sans espace, uniquement avec des caractères alphanumériques, et commençant par une
majuscule : NomDUneClasse
• on nomme le reste en minuscule avec des underscores : nom_de_methode, nom_d_attribut, etc...
Exemple :
voiture_sport = VoitureSport()
• La convention la plus surprenante est celle du premier paramètre des méthodes qui contient l’objet en cours.
Son nom n’est pas forcé, contrairement aux autres langages (comme this en Java par exemple), en fait c’est
un paramètre tout à faire ordinaire. Néanmoins, la (très très forte) convention est de l’appeler self : appelezdonc TOUJOURS le premier paramètre de chaque méthode self, et rappelez-vous qu’il contiendra toujours
l’instance courante.
• Enfin, les concepteurs de Python ont ajouté une convention supplémentaire : les méthodes appelées automatiquement sont appelées __nom_de_methode__ (avec deux underscores de chaque côté).
En effet, il existe un certains nombre de méthodes que vous pouvez écrire, et si vous les nommez d’une certaine
façon, elle seront appelées automatiquement quand une condition spéciale (liée au nom), se présente (nous
avons rencontré cela avec la méthode __init__).
Cours Info
- Jacques Delfaud -
Page 6 sur 6
Téléchargement