self

Le premier paramètre d’une méthode : l’objet sur lequel la méthode a été appelée. Il donne accès à ses attributs et à ses autres méthodes.

Sur cette page

Exemple

#
Python
class Student:
    def __init__(self, name):
        self.name = name
        self.points = 0

    def add_points(self, amount):
        self.points += amount
        return self.summary()

    def summary(self):
        return f"{self.name}: {self.points} pts"

léa = Student("Léa")
lucas = Student("Lucas")

print(léa.add_points(30))
print(lucas.add_points(10))
print(Student.add_points(léa, 5))
Résultatrésultat enregistré, vous pouvez le vérifier
Léa: 30 pts
Lucas: 10 pts
Léa: 35 pts

Définition et utilisation

#

Chaque méthode ordinaire d’une classe reçoit comme premier argument l’objet sur lequel elle a été appelée. Par convention, ce paramètre s’appelle self. C’est par lui que la méthode lit et modifie les données d’un objet précis : self.points += 10 ajoute des points uniquement à l’élève pour lequel la méthode a été appelée.

Python transforme l’appel léa.add_points(10) en Student.add_points(léa, 10). C’est pourquoi la définition d’une méthode compte un paramètre de plus que son appel : l’objet placé avant le point atterrit automatiquement dans self. Pour la même raison, à l’intérieur d’une méthode, vous écrivez les autres méthodes et attributs de cet objet avec le préfixe self., par ex. self.summary().

self n’est pas un mot-clé, seulement une convention largement respectée. Le paramètre pourrait porter un autre nom, mais un tel code serait déroutant pour tout lecteur. Contrairement à this en JavaScript ou en Java, self doit être explicitement écrit comme premier paramètre de chaque méthode ordinaire.

Un attribut assigné via self.nom = ... appartient à un seul objet. Une variable écrite directement dans le corps de la classe est un attribut de classe, partagé par tous ses objets. La lecture de self.nom vérifie d’abord l’objet, puis la classe, mais une assignation via self crée ou modifie un attribut de l’objet lui-même, et l’attribut de classe reste inchangé.

Syntaxe

#
Syntaxe
class Nom:
    def méthode(self, argument):
        self.attribut = argument
        return self.autre_méthode()

objet.méthode(argument)

Plus d’exemples

#
Attributs de classe et attributs d’objet
Python
class Student:
    school = "CodeWorlds"
    count = 0

    def __init__(self, name):
        self.name = name
        Student.count += 1

léa = Student("Léa")
lucas = Student("Lucas")
lucas.school = "École n° 5"

print(léa.school, lucas.school, Student.school)
print(Student.count, vars(lucas))
Résultatrésultat enregistré, vous pouvez le vérifier
CodeWorlds École n° 5 CodeWorlds
2 {'name': 'Lucas', 'school': 'École n° 5'}
Un self manquant dans la définition
Python
class Lesson:
    def start():
        return "Démarrage de la leçon"

try:
    Lesson().start()
except TypeError as error:
    print(error)
Résultatrésultat enregistré, vous pouvez le vérifier
Lesson.start() takes 0 positional arguments but 1 was given

Python a passé l’objet comme premier argument, mais la méthode n’avait pas de paramètre pour le recevoir.

Bonnes pratiques

#
  • Nommez toujours self le premier paramètre d’une méthode ordinaire. Les éditeurs, les linters et tous les lecteurs du code reconnaissent cette convention.
  • Le message « takes 0 positional arguments but 1 was given » lors de l’appel d’une méthode signifie généralement qu’il manque self dans sa définition.
  • Modifiez les compteurs et réglages partagés via le nom de la classe, par ex. Student.count += 1. Une assignation via self crée un attribut distinct dans un seul objet.

Entrées associées

#

Pratiquer dans les leçons

#

Vous voyez une erreur ou il manque un exemple ? Écrivez-nous.