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.
Exemple
#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))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
#class Nom:
def méthode(self, argument):
self.attribut = argument
return self.autre_méthode()
objet.méthode(argument)Plus d’exemples
#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))class Lesson:
def start():
return "Démarrage de la leçon"
try:
Lesson().start()
except TypeError as error:
print(error)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
selfle 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
selfdans sa définition. - Modifiez les compteurs et réglages partagés via le nom de la classe, par ex.
Student.count += 1. Une assignation viaselfcrée un attribut distinct dans un seul objet.
Entrées associées
#- __init__()Une méthode appelée automatiquement lors de la création d’un objet. Elle y enregistre les données initiales, c’est-à-dire les attributs.
- @classmethodUne méthode qui reçoit la classe (cls) au lieu d’un objet. Elle sert le plus souvent de constructeur alternatif.
- @staticmethodUne méthode qui ne reçoit automatiquement ni l’objet ni la classe. Elle se comporte comme une fonction ordinaire placée dans une classe.
- @propertyTransforme une méthode en attribut : la valeur est calculée à la lecture, et un setter optionnel contrôle l’écriture.
Pratiquer dans les leçons
#Vous voyez une erreur ou il manque un exemple ? Écrivez-nous.