Vous êtes sur la page 1sur 33

PROGRAMMATION ORIENTÉE

OBJETS

M. EMINI ME ZENANGA Amstrong


PLAN DU COURS
CHAPITRE 1: LES ÉLÉMENTS DE LANGAGE
CHAPITRE 2: LES FONDAMENTAUX DE LA POO
❑ MÉTHODE
❑ CLASSE
❑ OBJET

CHAPITRE 3: LES FONDAMENTAUX DE LA POO


❑ HÉRITAGE
❑ SOUS CLASSE
❑ SURCHARGE
CHAPITRE 4: STRUCTURATION DU CODE ET UTILISATION
DES MODULES
CHAPITRE 1:
MÉTHODES ET CLASSES
1. COMPRENDRE LA POO
❑ En programmation procédurale nous utilisons des variables et des
fonctions;

❑ On exécute des tâches en appelants ces fonctions et en modifiants ses


variables;

❑ En POO nous considérons toute chose en relation entre objet;

❑ Un objet peut être vu comme une boite qui possède un étiquète(son


nom), un état(des données) et un comportement(des méthodes);

❑ Exemple: Un gâteau a une saveur(une donnée) ainsi que la capacité d’ être


coupé en part(comportement);
❑ 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.

❑ 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.
❑ Un objet peut être stocké dans une variable, tout comme n’importe quelle
donnée(nombre ou une chaine de caractère);

❑ Nous pouvons créer des objets dans notre code, changer leur état et appeler
leurs méthodes;

❑ Les objets sont créés à partir des classes qui constituent des plans ou des
recettes;

❑ Ces classes servent à définir des attributs donc un état, un comportement;


❑ 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;

❑ Différence entre une méthode et une fonction:

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.
❑ É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.
2. LES OBJETS
❑ 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

❑ L’on peut 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.
❑ La POO 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 »).

Exemple: 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
État (Variables)
• Name
• phone_number
• bank_account

Comportement (Méthodes)
• bill_customer(cost)
• refund_customer(amount)

Exercice 1:

•Pour chaque situation, identifiez une classe et créez un diagramme simple,


en vous aidant du diagramme Client ci-dessus.

•Ensuite, identifiez toutes les variables nécessaires en fonction de la


description, suivies de toutes les méthodes. N’ajoutez que les attributs qui
sont mentionnés dans la description.
1. J’ai une boîte à outils. Cette boîte à outils peut contenir des outils, et je
peux ajouter ou enlever des outils à la boîte à outils.

2. Je possède aussi des marteaux. Les marteaux peuvent être de couleurs


différentes, et peuvent être utilisés pour planter et pour retirer des clous. Je
peux également changer la couleur d’un marteau en le peignant.

3. Enfin, je possède aussi des tournevis. Ils ont une taille (mesurée en
millimètres) et peuvent être utilisés pour serrer ou desserrer une vis.
3.ECRITURE DES CLASSES EN
PYTHON
❑ Pour créer une classe, on utilise le mot-clé class, des déclarations de
fonctions (def), et des déclarations d’affectation de variables (x = 3).

❑ Chaque déclaration de classe commence avec le mot-clé class suivi du nom


de cette classe.

❑ Toutes les variables et méthodes qui composent cette classe (ses « attributs »)
sont définies en dessous dans sa portée
❑ Quand on déclare une méthode, on utilise le mot-clé def – exactement
comme pour les fonctions.

❑ Les méthodes d’instance incluent toujours « self » en premier paramètre.

❑ Ce paramètre référence l’objet lui-même, et il permet d’accéder à ses


autres attributs.

Par exemple, nous nous en servons dans calculate_area pour multiplier la


largeur (self.width) de l’objet par sa hauteur (self.height).
❑ Note: En programmation orientée objet, il existe trois types d’attributs :

•Les attributs d’instance (propres aux instances créées),

•Les attributs de classe (propres à la classe, et partagés entre les instances),

• Les attributs statiques (qui sont presque indépendants de la classe).

❑ Ici, nous avons défini des attributs dits « de classe », et ses variables seront
partagées par toutes les autres instances de la classe Rectangle.

❑ Enfin, vous avez les variables – elles permettent de définir des valeurs par
défaut à nos objets.
Déclarez des variables dynamiques avec le constructeur
__init__

❑ Il existe une catégorie spéciale de méthode nommée constructeur.

❑ Chaque classe en a un, et il est utilisé pour créer des objets à partir de cette
classe.
❑ En Python, ce constructeur est une méthode nommée __init__

❑ Elle permet de modifier le comportement interne de la classe


❑ Les constructeurs vous permettent de passer des valeurs initiales à un objet
en cours de création.

❑ Les constructeurs vous permettent de passer des valeurs initiales à un objet


en cours de création.

❑ En définissant ces valeurs plutôt dans le constructeur, nous pouvons initialiser


des objets avec différentes longueurs et largeurs.

❑ De plus, les attributs définis dans la méthode __init__ ne seront pas


partagés par les autres instances.

❑ Ce sont des attributs d’instance, qui seront propres à chaque objet créé.
Note: Le corps de la méthode peut être vide. Il suffit d’utiliser le mot clé pass
en python;

Exercice 2:

Dans votre propre environnement de développement, écrivez 3 classes, soit


une pour chacune des classes que vous avez identifiées et planifiées dans
l’exercice 1 de la section précédente (boîte à outils, tournevis et marteau).
4. CREATION ET UTILISATION DES
OBJETS EN PYTHON
❑ Nous utilisons des constructeurs pour créer des objets d’une classe spécifique.

❑ Exemple: Création d’un Rectangle de longueur 5 et de largeur 3

❑ Il est important que les paramètres que vous fournissez correspondent aux
paramètres du constructeur.

❑ Lorsque nous instancions un objet, nous devons habituellement l’affecter à


une variable pour pouvoir l’utiliser.
❑ Nous pouvons accéder aux attributs d’un objet et leur affecter des valeurs;

❑ Les attributs rectangle.length et rectangle.color fonctionnent ici exactement


comme d’autres variables le feraient;

❑ Le grand intérêt des objets est que leurs valeurs sont stockées en eux ;

❑ Nous pouvons également assigner des variables aux retours de méthodes,


comme avec les fonctions :
Les types d’attribut
❑ Les attributs d’instance :

▪ Les attributs d’instance sont des variables définies à l’aide de self;

• Elles sont relatives à l’instance, et ne peuvent être accédées sans


instanciation

• Dans le cadre des méthodes, ce sont les méthodes classiques d'une classe,
qui possèdent self en premier paramètre.
❑ Les attributs de classe

▪ sont des variables définies directement dans le corps de la classe.

• Elles peuvent être accédées par la classe, sans passer par l’instanciation.

• Les attributs de classe peuvent se référencer entre eux, mais ne peuvent


pas accéder aux attributs d’instance.
• Dans le cadre des méthodes, elles seront précédées par un @classmethod,
et leur premier paramètre sera cls (à la place de self) :
• Les attributs de classe sont souvent utilisés pour créer des données ou
des actions globales à la classe, qui ne dépendent pas d’une instance.

• Les instances peuvent cependant y accéder. Modifier un attribut de


classe dans une instance le modifiera dans toutes les autres !
❑ Les attributs statiques

▪ Des attributs qui n’ont pratiquement aucun lien avec la classe.


• Seules les méthodes peuvent être statiques, et l’ajout par rapport aux
attributs de classe est minime :

• On n'a plus besoin de spécifier le paramètre cls

• Pour créer un attribut statique, il suffit de faire précéder la méthode


par @staticmethod

Il est recommandé de privilégier les attributs d’instance qui permettent


d’utiliser la programmation orientée objet à son plein potentiel.

Les attributs de classe peuvent être très utiles, mais sont censés être plus
rares.
CHAPITRE 2:
NOTION D’HERITAGE
1. Concept d’héritage
❑ L’une des choses les plus utiles de la programmation orientée objet,
c’est le concept d’héritage.

❑ L’héritage vous permet de créer une sous-classe (ou classe enfant)


d’une classe parent, qui contient les attributs du parent ainsi que
d’autres attributs spécifiques à l’enfant.
❑ Exemple de deux classes : Film et FilmCassette. FilmCassetteest une sous-
classe/classe enfant de Film, et Film est une superclasse/classe parent
de FilmCassette.
❑ Notez quewatch()("Voir") et name("Nom") sont des attributs de Film
dont FilmCassette hérite. D

❑ Celui-ci ajoute également ses propres attributs :magnetic_tape (la "bande


magnétique") et rewind() ("rembobiner").

❑ L’héritage est utilisée pour plusieurs raisons:


• La réutilisabilité
Lorsque nous faisons de notre film de science-fiction une sous-classe de
Film, nous n’avons pas besoin d’ajouter à nouveau notre attribut name,
ni de réécrire notre méthode watch().

• L'extensibilité
L’héritage permet également l’extensibilité – c’est-à-dire la possibilité
d’étendre la fonctionnalité d’un programme sans avoir à modifier le code
existant.
• Les modèles
L’un des avantages de l’héritage concerne la façon dont nous concevons
les systèmes.
L’héritage, et les classes en général, nous permettent d’exprimer des
relations entre différentes parties de notre code.

Exercice: Ci-dessous, vous avez quelques lignes décrivant une problématique.


À partir de cette description, identifiez les classes, leurs état et comportement,
et identifiez quelles classes sont les classes enfants/parents des autres.
Fort de votre expérience en pâtisserie, vous décidez de créer un forum en ligne
pour parler de gâteaux ! Sur ce forum, les utilisateurs fans de pâtisserie
pourront :

•s’inscrire et se connecter ;
•parler de leurs gâteaux préférés, en créant de nouveaux fils de discussion ;
•répondre à des messages, dans les fils existants.
Un fil de discussion sur ce forum a un titre, une date de création et une
collection de posts lui correspondant.

Chaque post contient du texte, l’utilisateur qui l’a publié et la date de


publication.

Les utilisateurs ont la possibilité d’attacher des fichiers à leurs posts :

•Partez du principe qu’il peut y avoir de nombreux types de fichiers, mais


nous sommes surtout intéressés par les fichiers images.

•Un post peut avoir un fichier attaché, ce qui changera la façon dont le
post est affiché. Ce serait donc un nouveau type de post.

Enfin, il y a des utilisateurs spéciaux nommés modérateurs, qui ont la capacité


de modifier un post pour qu’il contienne du contenu nouveau, et de supprimer
ceux qui ne parlent pas de gâteaux.
2. Application au langage python
❑ L’élément principal de syntaxe utilisé pour définir les sous-classes se trouve
dans la définition de classe elle-même : class FilmCassette(Film)
❑ Le parent de la classe est placé entre parenthèses après le nom de la classe
dans la toute première ligne de la classe
❑ Le principal intérêt de l’héritage est d’étendre notre classe de base, en lui
ajoutant des attributs
Exercice: Dans cet exercice, nous utiliserons les classes que vous avez définie
dans la section précédente, au sujet de la création d’un forum.

Dans votre environnement de développement, écrivez une définition de classe


pour chacune de ces classes (en utilisant des sous-classes lorsque c’est judicieux).

Pour l’instant, supposons que nous sortions uniquement le contenu d’un post
vers le terminal. L’implémentation de l’affichage des posts n’est pas obligatoire,
utilisez simplement pass pour ces méthodes.
3. La surcharge des méthodes python
❑ La surcharge désigne le concept selon lequel une classe enfant crée
une nouvelle implémentation d’une méthode héritée.

❑ Lorsqu’une méthode dans une classe enfant est créée avec le même nom et la
même signature qu’une méthode dans le parent, la méthode enfant l’emporte.

❑ Bien que la surcharge nous permette de modifier entièrement des


comportements hérités, il peut parfois être utile d’avoir accès au code des
méthodes des classes parents, depuis les classes enfants.

❑ L’un des emplacements les plus courants pour cette utilisation se trouve
dans les constructeurs. Pour cela, nous utilisons super()
Dans cet exemple, Coffee ("café") est une sous-classe de Drink ("boisson").
La classe Coffee possède ses propres tarifs, qu’elle passe au constructeur
de Drink pour initialiser le bon prix !

Vous aimerez peut-être aussi