Notes et transcriptions du cours “Apprenez la programmation orientée objet avec Python” disponible sur la plateforme Openclassrooms.
Imaginez que vous n'ayez que quelques heures pour épater votre amie, qui vient vous retrouver après un long voyage. Pour rendre cet instant unique, vous avez tout préparé : vous comptez lui concocter un gâteau au chocolat dont elle se souviendra longtemps.
Ce gâteau se base sur une recette dont vous avez le secret. Vous la sortez donc du placard, et suivez méticuleusement les instructions… jusqu'à arriver au résultat !
Ce principe de recette se retrouve en programmation orientée objet. Vous êtes le chef de votre code, et concoctez vos plats (que l'on appellera des objets) avec vos recettes (que l'on appellera des classes).
Et si nous parlons de « préparation » d'un plat en cuisine, nous parlerons plutôt d'instanciation de classe en programmation orientée objet (POO).
Vous constatez que tous les gâteaux préparés avec la même recette sont similaires ? Il en est de même avec les objets partageant une même classe. Ils font partie de la même structure.
Mais qu’y a-t-il dans une classe, en réalité ?
Une classe contient un état et un comportement.
L’état fait référence à des données ou des variables. Une classe Cake
(Gâteau), par exemple, peut avoir une variable flavor
(saveur).
Le comportement d’une classe désigne simplement une série de choses que cette classe peut faire. Ce comportement est contenu dans les méthodes, qui sont identiques conceptuellement aux fonctions. Toujours pour reprendre notre exemple du gâteau, nous pourrions définir un comportement spécifique aux anniversaires (ajouter des bougies).
Prenons cet exemple. Ici, nous avons une recette pour Cake
qui spécifie qu’un gâteau a une saveur et la capacité d’être découpé en parts.
Notez en particulier que la recette elle-même a un « vide » pour la saveur du gâteau. C’est parce que la recette en elle-même n’est pas un élément réel existant dans le monde. Lorsque nous créons (ou instancions) un gâteau à partir de cette recette, le gâteau réel a une saveur.
La recette pour Cake
possède aussi la méthode cut_in_parts()
(« couper en parts »), ce qui signifie que tous les gâteaux créés à partir de cette recette la possèdent également (c’est-à-dire qu’ils ont tous le comportement« couper en parts »).
Alors, quelle est la différence entre une méthode et une fonction ?
Tout simplement, une méthode fait partie d’une classe, alors qu’une fonction est indépendante des classes. Les méthodes peuvent prendre des paramètres, modifier l’état interne de l’objet, appeler d’autres méthodes ou fonctions, et retourner des valeurs.
On « appelle » (« call », en anglais) une fonction ou méthode lorsqu’on l’utilise dans le code. Par exemple, la ligne x = add(2, 3)
appelle la fonction add
(additionner) avec les paramètres 2 et 3. Un appel se définit le plus simplement par l’utilisation de parenthèses après le nom de la fonction, la méthode ou même la classe.
Étant donné qu’une méthode fait partie d’une classe, elle fait aussi partie d’un objet créé à partir de cette classe. La seule différence entre une fonction et une méthode, c’est que les méthodes font partie d’une classe/d’un objet.
Si la classe sert de modèle, de recette pour créer nos objets, les objets sont des créations qui prennent vie dans votre code.
Les objets peuvent être stockés dans une variable, et le type de cette variable référence la classe. De la même façon que le type du chiffre « 5 » est un entier (int), et le type du mot « bonjour » est une chaîne de caractères (str), le type d’un objet gâteau est Cake
.
Vous pouvez modifier l’état d’un objet, ou appeler des méthodes dessus.
On peut instancier plusieurs objets de la même classe, et ces objets sont indépendants. Le fait de créer un plat chez vous ne le crée pas chez votre voisin.
Je peux déjà créer des variables et des fonctions, pourquoi créer des classes et des objets ?
La programmation orientée objet (POO) est une façon différente de penser la programmation, par rapport à la programmation procédurale que vous avez connue précédemment. Elle permet de structurer son code autrement, tout en ajoutant une couche d’abstraction supplémentaire : en définissant un monde d’objets proche de notre monde à nous.
Techniquement, il s’agit de manipuler des sortes de conteneurs (les classes), qui stockent à la fois des valeurs brutes (appelées « propriétés ») et des fonctions (appelées « méthodes »).
Dans le cas suivant, « Client » constitue la classe. Un Client peut avoir un nom, un numéro de téléphone et un compte en banque – soit un état – et vous voudrez peut-être pouvoir facturer ou rembourser ce client – soit un comportement.
.-------------------------. | Client | |-------------------------| | name | | phone_number | | bank_account | | | | bill_custommer(cost) | | refund_customer(amount) | | | | | '-------------------------'
Il est logique de lier ainsi les informations d’un client aux opérations que nous voulons leur appliquer, c'est ce que permettent de faire les classes.
Maintenant que nous avons introduit les concepts, il est temps d’essayer de la mettre en pratique nous-mêmes. Munissez-vous d’une feuille de papier ou ouvrez un éditeur de texte.
Vous trouverez ci-dessous quelques lignes décrivant un contexte :
C’est parti !
Une fois que vous avez créé vos diagrammes, gardez-les ! Nous allons les utiliser au chapitre suivant, lorsque nous commencerons à écrire du code Python.
Maintenant que vous connaissez les concepts de base, il est temps d’écrire du code orienté objet en Python.