6
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 pro- grammation 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 attri- buons à 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

Programmation Orientée Objets - delfaud.fr · Python 16 POO Programmation Orientée Objets 1 Introduction Laprogrammationorientéeobjet(POO)permetdecréerdesentités(objets)quel’onpeutmanipuler.Lapro-

Embed Size (px)

Citation preview

Python 16 POO

Programmation Orientée Objets

1 IntroductionLa programmation orientée objet (POO) permet de créer des entités (objets) que l’on peut manipuler. La pro-grammation orientée objet impose des structures solides et claires. Les objets peuvent interagir entre eux, celafacilite 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 plusune 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éfautdans 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 applicationExplicitons l’exemple ci-dessous :

from math import *class Point(object) :

def __init__(self, coordx, coordy, coordz) :self.x=coordxself.y=coordyself.z=coordzself.type="Point"

def distance(self,pt) : #définit une méthode (ou fonction) pour les objets de cette classedist = 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 attri-buons à self des caractéristiques. Ici self recevra les caractéristiques d’un point comprenant une composantesur 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 deuxpoints 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 AB=Point( 24 , 27, 29 )print(A.distance(B)) # donne la distance de A à Bprint(A.type) # A est un Point

Etudions maintenant tout ceci plus en détail.

3 Les classesUne classe regroupe des fonctions et des attributs qui définissent un objet. On appelle par ailleurs les fonctionsd’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 notrecas, on stock le nom dans l’attribut nom.

4 Les objetsUn 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 classeLes attributs de classe permettent de stocker des informations au niveau de la classe. Elle sont similaires auxvariables.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éthodesLes 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ésQuelque soit le langage, pour la programmation orientée objet il est de préférable de passer par des propriétéspour changer les valeurs des attributs. Alors bien que cela ne soit pas obligatoire, il existe une convention depasser 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 égalementimpacter 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=4def_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 aulieu 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 classeL’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 = 4moteur = 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 attri-buts.

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 desurcharge de méthode.

Cours Info - Jacques Delfaud - Page 4 sur 6

Python 16 POO

9 Polymorphisme / surcharge de méthodeComme 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 = 4moteur = 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 sur-charger une méthode.

class Voiture :roues = 4moteur = 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 lamé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 = 4moteur = 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émarreLa voiture de sport démarre

Les classes Voiture et VoitureSport possèdent donc chacune une méthode de même nom mais ces méthodesn’effectuent pas les mêmes tâches. On parle dans ce cas de polymorphisme.

10 ConventionsEn Python, peu de choses sont forcées. La plupart des choses sont des conventions. Mais ce sont des conventionsfortes, 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 unemajuscule : 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’estun paramètre tout à faire ordinaire. Néanmoins, la (très très forte) convention est de l’appeler self : appelez-donc TOUJOURS le premier paramètre de chaque méthode self, et rappelez-vous qu’il contiendra toujoursl’instance courante.

• Enfin, les concepteurs de Python ont ajouté une convention supplémentaire : les méthodes appelées automa-tiquement 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 certainefaçon, elle seront appelées automatiquement quand une condition spéciale (liée au nom), se présente (nousavons rencontré cela avec la méthode __init__).

Cours Info - Jacques Delfaud - Page 6 sur 6