1. Programmation orientée objet#
1.1. Extrait du programme#
Contenu |
Capacité |
Commentaires |
---|---|---|
Vocabulaire de la programmation objet : classes, attributs, méthodes, objets. |
Écrire la définition d’une classe. Accéder aux attributs et méthodes d’une classe. |
On n’aborde pas ici tous les aspects de la programmation objet comme le polymorphisme et l’héritage. |
1.2. Vocabulaire utilisé#
Dans l’exemple des listes, on utilise la programmation orientée objet (POO) pour réaliser les «objets» nécessaires. Il s’agit d’un paradigme de programmation que nous étudierons plus en détail dans l’année.
La programmation orientée objet à pour but d’abstraire le monde physique en représentant ses objets par des propriétés (attributs) et des opérations (on parle aussi de méthodes). Autrement dit, il s’agit de modéliser un objet de la vie réelle par ses propriétés et par ce qu’il peut faire. Certaines propriétés sont fixées à la création, d’autres peuvent être modifiées dans le cycle de vie de l’objet, et c’est souvent au travers des méthodes qu’elles le sont.
Un des concepts clefs de la programmation objet est la définition de Classes qui définissent des catégories d’objets, alors que l’objet lui est défini comme une instance de classe.
Voyons ça sur quelques exemples :
class Chien:
def __init__(self):
pass
Belle = Chien()
Belle
<__main__.Chien at 0x7fae1fc94a50>
type(Belle)
__main__.Chien
On utilise le mot clef
pour définir une classe d’objets.
La première fonction (def __init__(self, nom):
) est le initiateur de la classe, qui explicite comment initialiser l’objet, et qui précise, ce que nous allons stocker comme attributs de classe. Pour l’instant, celui-ci ne fait rien. La variable self
est une référence à l’objet lui même.
def __init__(self, age):
self.age = age
Belle = Chien(3)
Belle.age
3
On peut modifier l’initialisation de la classe pour prendre comme paramètre d’entrée la date de naissance du chien. La fonction d’initialisation (__init__
) permet de traiter ce paramètre pour stocker l’age.
from datetime import datetime,timedelta
def __init__(self, date_naissance):
self.age = round((datetime.now() - datetime.fromisoformat(date_naissance)).days / 365)
Belle = Chien('2017-07-28')
Belle.age
7
Le constructeur calcule l’age en fonction de la date de naissance qui a été fournie lors de l’instanciation de l’objet.
On peut vouloir doter notre objet d’actions (on parle de méthodes). Par exemple, le chien peut aboyer :
class Chien:
def __init__(self):
pass
def aboyer(self,message=None):
if message == None:
return('Ouaf !')
else:
return(message)
Belle = Chien()
Belle.aboyer()
'Ouaf !'
Belle.aboyer('Sébastien !')
'Sébastien !'
Belle.__class__.__name__
'Chien'
1.3. Exercice pour comprendre#
Écrire une classe permettant de simuler un personnage capable de se déplacer sur un réseau d’entiers. Sa position de départ sera le couple 0,0 et l’utilisateur pourra saisir respectivement “h”,”j”,”k”,”l” pour déplacer le personnage respectivement vers la gauche, le bas, le haut, la droite. On ne considère ici que des coordonnées positives.
class Personnage:
def __init__(self):
pass
Show code cell content
class Personnage:
### BEGIN SOLUTION
def __init__(self):
self.position = [0,0]
def deplacer(self,direction):
if direction == 'h' and self.position[0] != 0:
self.position[0] -= 1
elif direction == 'j' and self.position[1] != 0:
self.position[1] -= 1
elif direction == 'k':
self.position[1] += 1
elif direction == 'l':
self.position[0] += 1
else:
return 'Erreur'
def get_position(self):
return tuple(self.position)
### END SOLUTION
joueur1 = Personnage()
assert joueur1.get_position() == (0,0), 'La position de départ est (0,0)'
assert joueur1.deplacer('h') == 'Erreur', 'On renvoie le message "Erreur" en cas de déplacement impossible'
assert joueur1.deplacer('k') == None, 'Pas de message quand tout se passe bien'
assert joueur1.get_position() == (0,1), 'La position après le déplacement vers le haut doit être (0,1)'
assert joueur1.deplacer('j') == None, "Pas d'erreur cette fois, le déplacement est valide"
assert joueur1.deplacer('j') == "Erreur", "Cette fois, on a une erreur"
1.4. Compléments sur la « magie » des classes#
Lorsqu’on utilise
belle = Chien()
en réalité, un objet vide nommé belle
est réservé et la méthode (une fonction) Chien.__init__(belle)
est appelé, ce qui a pour effet d’initialiser l’objet belle
comme une instance de Chien
.
De la même façon, lors de l’appel à la méthode belle.aboyer('Sébastien')
, ce qui est réellement exécuté est Chien.aboyer(belle,'Sébastien')