Vous êtes sur la page 1sur 5

Algorithmique et programmation orientée objet

Tutorat 2

Objectif :
• Apprendre à modéliser des objets sous forme de classe et avec héritage
• Coder cette modélisation en python
• Comprendre les mécanismes d’héritage, de polymorphisme

Tous les codes fournis (classes et tests sur les classes) sont sur l’ent et en annexe de cet énoncé.
L’énoncé se veut progressif, à partir du code proposé, on met en évidence un problème, puis on indique
comment le résoudre.
Tous les attributs doivent être privés (leur nom commence par __). Au fur et à mesure de votre
progression, notez pour chaque classe, ses méthodes et attributs.

Une classe Coordonnee dont le code est fourni sur l’ent sera utilisée pour définir nos autres classes.
Exécutez le code de test associé à cette classe.

Exercice 0

On considère les classes Figure, Polygone, Cercle, Quadrilatere.


On suppose que vous savez quelle(s) classe(s) hérite(nt) de quelle autre

On considère que toutes les figures


- peuvent être translatées : on a donc dans la classe Figure une méthode translater ayant
comme paramètres dX et dY) et
- possèdent un périmètre (méthode périmètre)
Comme on ne connaît pas la manière de calculer un périmètre ou de translater n’importe quelle figure,
on ne peut pas écrire le code de ces méthodes. Cependant on peut par défaut dire qu’elles existent et
produire une erreur (raise …. ) quand on les appelle.
Le fichier figure.py implante en python ces concepts.
Exécutez le code de test fourni
Exercice 1 : Cercle
On considère maintenant les cercles (qui hérite de Figure). On vous propose le code suivant (qui est
dans le fichier exo1.py):

class Cercle(Figure):
def __init__(self,centre,rayon):
self.__centre = centre
self.__rayon=rayon
ainsi que le code de test suivant :

def testCercle():
centre = Coordonnee()
rayon = 4
c = Cercle(centre,rayon)
print(str(c))
print(c.perimetre())
c.translater(2,4)
print(str(c))

1
Algorithmique et programmation orientée objet

Si vous rencontrez des problèmes pour exécutez ce code :


1) Solution « brutale » : tout mettre dans le même fichier
2) Positionner tous les fichiers dans le même répertoire et faire « run file as script » dans le menu
« RUN »

Expliquez pourquoi str affiche « Figure » et que l’appel à perimetre provoque une erreur
Corrigez en ajoutant
i) le code de la méthode périmètre,
ii) une méthode translater pour Cercle
iii) une méthode __str__ qui permettra un affichage plus sympathique.

Vous devez obtenir lors de l’appel au test l’affichage suivant :


Cercle (0,0)rayon 4
25.132741228718345
Cercle (2,4)rayon 4

Exercice 2 : Polygone

On considère que les polygones sont définis (via leur constructeur) par une liste de coordonnées.

Pourquoi la définition suivante de la classe Polygone est fausse ?


class Polygone(Coordonnee):
Et qu’il faut écrire
class Polygone(Figure):

Définissez le constructeur de la classe Polygone, une méthode nbCote indiquant le nombre de côté du
polygone (la longueur de la liste de coordonnées, qui est un attribut) et une méthode d’affichage.
Vous code devra pouvoir être utilisé avec le code de test suivant :
def testPolygone():
c1=Coordonnee()
c2=Coordonnee(3,4)
c3=Coordonnee(4,5)
c4=Coordonnee(2,7)
p=Polygone([c1,c2,c3,c4,Coordonnee(1,2),Coordonnee(3,2),Coordonnee(2,4)])
print(str(p))

et affichera :
Polygone 7

Exercice 3 : Quadrilatere

Un quadrilatère est un polygone, il est donc défini par une liste de 4 Coordonnee (REMARQUE pour
ce tutorat, on ne testera pas si l’utilisateur en donne plus ou moins de 4).

On vous demande d’écrire un constructeur pour cette classe, quel problème avons-nous pour accéder à
la liste de coordonnées de Polygone (attribut privé de la classe). En quoi la définition d’un attribut
spécifique à la classe Quadrilatère est-elle une erreur de conception ?

2
Algorithmique et programmation orientée objet

La solution est de faire appel au constructeur de la classe mère (Polygone) à l’aide de la fonction super().
Documentez-vous (openclassroom, …) pour (re)voir ce à quoi correspond super().__init(…) en python
3.
Codez le constructeur et testez le avec par exemple ce code :
c1=Coordonnee()
c2=Coordonnee(0,1)
c3=Coordonnee(1,1)
c4=Coordonnee(1,0)
l=[c1,c2,c3,c4]
q=Quadrilatere(l)
print(str(q))
# print(q.perimetre())

On souhaite maintenant mettre programmer la méthode périmètre pour les quadrilatères. Pour cela il
suffit de parcourir la liste des coordonnées et de sommer les distances entre elles. Le problème que nous
avons est que cette liste est stockée dans un attribut privé de la classe Polygone (et donc inaccessible
depuis Quadrilatère). La solution est donc de définir une méthode getCoord() dans la classe Polygone
qui retourne la valeur de cet attribut puis (enfin) de coder la méthode périmètre.
Testez en décommentant la dernière ligne du code de test.

3
Algorithmique et programmation orientée objet

Annexe code utilisé


coordonnee.py

import math
class Coordonnee():
def __init__(self, xx=0,yy=0):
self.__x=xx
self.__y=yy
def distanceOrigine(self):
return math.sqrt(self.__x*self.__x+self.__y*self.__y)
def affiche(self):
print("Coordonnee (",self.__x,',',self.__y,')')
def distance (self,uneAutre):
xx= self.__x-uneAutre.__x
yy= self.__y-uneAutre.__y
return math.sqrt(xx*xx+yy*yy)
def __str__(self):
"convertit l'objet en chaine"
return "("+str(self.__x)+","+str(self.__y)+")"
def translater(self,dx,dy):
self.__x= self.__x+dx
self.__y= self.__y+dy

def testCoord():
c1=Coordonnee()
c2=Coordonnee(3,4)
print(c1.distanceOrigine())
print(c1.distance(c2))
c2.affiche()
c2.translate(1,-1)
c2.affiche()

4
Algorithmique et programmation orientée objet

code fourni (ici non séparé en fichiers)

class Figure():
def __str__(self):
"convertit l'objet en chaine"
return "Figure"
def perimetre(self):
raise NotImplementedError
def translater(self,Dx,Dy):
raise NotImplementedError

def testFigure():
f = Figure()
print(str(f))
print("on va avoir une erreur !!!!")
print(f.perimetre())

class Cercle(Figure):
def __init__(self,centre,rayon):
self.__centre = centre
self.__rayon=rayon

def testCercle():
centre = Coordonnee()
rayon = 4
c = Cercle(centre,rayon)
print(str(c))
print(c.perimetre())
c.translater(2,4)
print(str(c))

def testPolygone():
c1=Coordonnee()
c2=Coordonnee(3,4)
c3=Coordonnee(4,5)
c4=Coordonnee(2,7)
p=Polygone([c1,c2,c3,c4,Coordonnee(1,2),Coordonnee(3,2),Coordonnee(2,4)])
print(str(p))

def testQuadri():
c1=Coordonnee()
c2=Coordonnee(0,1)
c3=Coordonnee(1,1)
c4=Coordonnee(1,0)
l=[c1,c2,c3,c4]
q=Quadrilatere(l)
print(str(q))
# print(q.perimetre())

Vous aimerez peut-être aussi