Aller au contenu
M03 · A. Appréhender le paradigme de la POO

Manipuler les méthodes

Définir et appeler des méthodes d'instance, choisir leur visibilité et leurs paramètres, et utiliser les méthodes de classe, les méthodes statiques et les fonctions imbriquées.

1Situer

Une épicerie de quartier à Agadir veut un panier d'achat pour sa future application. Le panier doit pouvoir ajouter un article, retirer un article, calculer le total avec une remise éventuelle, et se créer directement à partir d'une liste de courses. Chacune de ces actions est une méthode.

2Comprendre

Ce qui se passe lors d'un appel de méthode
APPEL panier.ajouter("Thé", 18, 2) DÉFINITION def ajouter(self, nom, prix, quantite=1): self=panier nom="Thé" prix=18 quantite=2 articles : [("Thé", 18, 2)]

On appelle la méthode ajouter sur l'objet panier, avec trois arguments.

1 / 5

Une méthode est une fonction définie à l’intérieur d’une classe. Elle décrit ce que l’objet sait faire.

def ajouter(self, nom, prix, quantite=1):
    self.articles.append((nom, prix, quantite))

On l’appelle avec un point : panier.ajouter("Thé", 18, 2). Python transforme cet appel en Panier.ajouter(panier, "Thé", 18, 2) : c’est pour cela que self reçoit l’objet.

Les paramètres d’une méthode

  • obligatoires : nom, prix ;
  • par défaut : quantite=1, qu’on peut omettre ;
  • nommés à l’appel : ajouter(prix=18, nom="Thé") ;
  • variables : *args (plusieurs valeurs), **kwargs (plusieurs paramètres nommés).

La visibilité d’une méthode

Comme pour les attributs : total() est publique, _sous_total() est protégée (usage interne), __calcul() est privée.

Trois sortes de méthodes

SorteDécorateurPremier paramètreExemple
d’instanceaucunself (l’objet)panier.total()
de classe@classmethodcls (la classe)Panier.depuis_liste(...)
statique@staticmethodaucunPanier.en_euros(108)

Les fonctions imbriquées

Une fonction peut être définie dans une méthode. Elle n’existe que pendant l’appel et sert à découper un calcul sans encombrer la classe : c’est le cas de appliquer() dans total().

Exemple simple

La télécommande

Chaque bouton de la télécommande déclenche une action sur la télévision : allumer, changer de chaîne, monter le son. Appeler une méthode, c'est appuyer sur un bouton de l'objet.

tele.allumer()
tele.changer_chaine(2)
tele.monter_son(5)
Exemple simple

Une méthode qui n'a pas besoin de l'objet

Convertir des dirhams en euros ne dépend d'aucun panier en particulier : c'est une méthode statique, rangée dans la classe parce qu'elle lui est liée.

class Panier:
    @staticmethod
    def en_euros(montant_dh):
        return round(montant_dh / 10.8, 2)

print(Panier.en_euros(108))   # 10.0

3Manipuler

Exécutez, puis ajoutez un article avec panier.ajouter("Huile", 32, 2) et appliquez une remise de 10 % avec panier.total(remise=10).
Pas à pas dans le lab ↗Python se charge au premier clic (environ 12 Mo, une seule fois).
Console
Mémoire : objets créés

Exécutez le code : les objets et leurs attributs s'afficheront ici.

4Pratiquer

Exercice 1 · Compter les articles

Ajoutez une méthode nb_articles() qui renvoie le nombre total d'unités dans le panier (en tenant compte des quantités).

Voir le corrigé
def nb_articles(self):
    return sum(q for _, _, q in self.articles)

Exercice 2 · Paramètres nommés

Appelez ajouter en nommant les paramètres, dans un ordre différent de la définition. Pourquoi est-ce utile ?

Voir le corrigé
panier.ajouter(quantite=3, nom="Eau", prix=5)
# Les paramètres nommés rendent l'appel lisible et évitent
# d'inverser le prix et la quantité par erreur.

Exercice 3 · Méthode de classe ou statique ?

Pour chaque méthode, dites si elle doit être d'instance, de classe ou statique : (1) vider() vide le panier ; (2) depuis_ticket(texte) crée un panier à partir d'un ticket ; (3) arrondir(montant) arrondit au centime.

Voir le corrigé
1. d'instance : elle modifie un panier précis (self)
2. de classe  : elle fabrique un nouvel objet (cls)
3. statique   : elle n'a besoin ni du panier ni de la classe

5Vérifier

1. Quel est le premier paramètre d'une méthode d'instance ?
2. Qu'est-ce qu'une méthode de classe (@classmethod) ?
3. Comment indique-t-on qu'une méthode est réservée à l'usage interne ?