À quoi sert le paramètre self en Python ? - Docstring

À quoi sert le paramètre self en Python ?

self est le nom du paramètre qui correspond à l'instance depuis laquelle la méthode est appelée dans la programmation orientée objet.

Le nom de ce paramètre est une convention. On pourrait l'appeler toto, i ou encore patrick.

Prenons l'exemple d'une classe très simple représentant une voiture :

#norun
class Voiture:
    def __init__(self, marque, vitesse, prix):
        self.marque = marque
        self.vitesse = vitesse
        self.prix = prix

mercedes = Voiture(marque="Mercedes", vitesse=200, prix=90000)

Dans le code ci-dessus, self correspond à l'instance mercedes lorsque l'objet est instancié.

Dans la méthode __init__, qui est appelée lors de la création de l'instance mercedes, self représente donc notre instance mercedes.

Quand on indique self.vitesse = vitesse, c'est comme si on indiquait mercedes.vitesse = vitesse.

Pour cette raison, on peut, hors de la classe, accéder à l'attribut vitesse qui a été créé sur l'objet mercedes :

class Voiture:
    def __init__(self, marque, vitesse, prix):
        self.marque = marque
        self.vitesse = vitesse
        self.prix = prix

mercedes = Voiture(marque="Mercedes", vitesse=200, prix=90000)
print(mercedes.vitesse)

Ce paramètre self doit absolument figurer en premier dans les méthodes qui composent une classe.

C'est grâce à ce paramètre que l'on va pouvoir accéder à notre instance.

Imaginons une méthode afficher_prix qui nous permette d'afficher le prix de la voiture :

class Voiture:
    def __init__(self, marque, vitesse, prix):
        self.marque = marque
        self.vitesse = vitesse
        self.prix = prix

    def afficher_prix(self):
        print("Le prix de la voiture est de", self.prix, "euros")

mercedes = Voiture(marque="Mercedes", vitesse=200, prix=90000)
mercedes.afficher_prix()

 Si vous omettez de mettre le paramètre self dans la méthode afficher_prix, Python vous retournera l'erreur suivante :

TypeError: afficher_prix() takes exactly 0 arguments (1 given) on line 11

Pourquoi Python nous indique-t-il que la méthode afficher_prix reçoit 1 argument (1 given) alors que quand nous appelons la méthode afficher_prix, nous n'envoyons aucun objet entre les parenthèses ?

Ce que vous ne voyez pas, c'est qu'en arrière-plan, Python utilise la classe pour appeler la méthode et envoi l'instance en argument :

class Voiture:
    def __init__(self, marque, vitesse, prix):
        self.marque = marque
        self.vitesse = vitesse
        self.prix = prix

    def afficher_prix(self):
        print("Le prix de la voiture est de", self.prix, "euros")

mercedes = Voiture(marque="Mercedes", vitesse=200, prix=90000)
# Quand on fait ceci :
mercedes.afficher_prix()
# En fait, Python fait ceci :
Voiture.afficher_prix(mercedes)

On voit bien ci-dessus que le paramètre self reçoit bien l'instance mercedes.

Cette opération est réalisée automatiquement par Python lorsque l'on appelle une méthode directement sur une instance (mercedes.afficher_prix() par exemple). 

C'est pour cette raison qu'on est obligé de mettre self comme premier paramètre dans les méthodes qui composent une classe.

Réservé aux membres abonnés

Inscris-toi

Pour pouvoir prendre des notes et ajouter des favoris tu dois être abonné à Docstring.

Voir les formules

Mes notes

Sauvegardé

Passages surlignés

Besoin d'aide ?

Essaie d'être le plus exhaustif possible en donnant suffisamment de détails pour qu'on puisse te répondre du premier coup 😉

Tu peux également visionner cette vidéo dans laquelle je t'explique comment poser ta question correctement et utiliser l'éditeur.

Tu souhaites nous remonter un bug ? Utilise-plutôt ce formulaire.

Cette fonctionnalité est réservée aux membres de la formule accompagnement de Docstring.

Aucun résultat.

Un problème sur le site ?

Aide-nous à améliorer Docstring en nous signalant un problème que tu as rencontré.

Que ce soit un bug sur une fonctionnalité ou une erreur dans une formation, on va pouvoir le corriger rapidement 😉

Page concernée

M'avertir par e-mail

Je veux être averti par e-mail lorsque ce bug est corrigé.