__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.

Renvoie
Toujours None. L’appel de la classe lui-même renvoie l’objet prêt à l’emploi.
Sur cette page

Exemple

#
Python
class Student:
    def __init__(self, name, points=0):
        self.name = name
        self.points = points
        self.level = points // 100 + 1

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

print(léa.name, léa.points, léa.level)
print(lucas.name, lucas.points, lucas.level)
print(vars(léa))
Résultatrésultat enregistré, vous pouvez le vérifier
Léa 250 3
Lucas 0 1
{'name': 'Léa', 'points': 250, 'level': 3}

Définition et utilisation

#

La méthode __init__, couramment appelée le constructeur, prépare un nouvel objet à être utilisé. Python l’appelle lui-même, juste après la création de l’objet, quand vous écrivez par exemple Student("Léa", 250). Les arguments donnés entre parenthèses après le nom de la classe arrivent justement dans __init__, dont le rôle est de les enregistrer comme attributs de l’objet : self.name = name.

Le premier paramètre, self, est l’objet qui vient d’être créé, que Python transmet automatiquement. Les autres paramètres fonctionnent comme dans une fonction ordinaire : ils peuvent avoir des valeurs par défaut et être donnés par leur nom. Les attributs n’ont pas besoin d’être une copie des arguments ; ils peuvent aussi être calculés à partir de ceux-ci, par exemple un niveau basé sur les points.

À proprement parler, l’objet est créé un instant plus tôt, dans la méthode __new__, qu’il est rarement nécessaire de toucher. __init__ se contente de l’initialiser et doit renvoyer None ; essayer de renvoyer une autre valeur se termine par une erreur TypeError. C’est un bon endroit pour vérifier la validité des données : une exception levée dans __init__ fait que l’appel de la classe ne renvoie pas d’objet, donc les données invalides n’atteignent jamais le reste du programme.

Syntaxe

#
Syntaxe
class Nom:
    def __init__(self, parametre, optionnel=valeur):
        self.attribut = parametre

Paramètres

#
  • self

    le nouvel objet

    L’objet en cours de création. Python le transmet automatiquement, donc vous ne le fournissez pas lors de l’appel.
  • autres paramètres

    valeurs quelconques

    Les arguments donnés lors de la création de l’objet, par ex. Student("Léa", 250). Ils peuvent avoir des valeurs par défaut.

Plus d’exemples

#
Vérifier les données à la création d’un objet
Python
class Course:
    def __init__(self, title, modules):
        if modules <= 0:
            raise ValueError("Un cours doit avoir au moins un module")
        self.title = title
        self.modules = modules

python = Course("Python", 12)
print(python.title, python.modules)

try:
    Course("Cours vide", 0)
except ValueError as error:
    print("Erreur :", error)
Résultatrésultat enregistré, vous pouvez le vérifier
Python 12
Erreur : Un cours doit avoir au moins un module
Piège : une liste comme valeur par défaut
Python
class Team:
    def __init__(self, name, members=[]):
        self.name = name
        self.members = members

red = Team("Rouges")
blue = Team("Bleus")
red.members.append("Léa")
print(blue.members)

class SafeTeam:
    def __init__(self, name, members=None):
        self.name = name
        self.members = list(members) if members is not None else []

red = SafeTeam("Rouges")
blue = SafeTeam("Bleus")
red.members.append("Léa")
print(blue.members)
Résultatrésultat enregistré, vous pouvez le vérifier
['Léa']
[]

La liste par défaut n’est créée qu’une seule fois, lors de la définition de la méthode, donc tous les objets Team partagent la même liste. SafeTeam crée une nouvelle liste pour chaque objet.

Bonnes pratiques

#
  • Définissez tous les attributs d’un objet dans __init__, même s’ils valent None au départ. On voit alors immédiatement quelles données l’objet contient.
  • N’utilisez ni liste ni dictionnaire comme valeur par défaut d’un paramètre. Écrivez None et créez la nouvelle collection à l’intérieur de la méthode.
  • Quand une classe sert surtout à stocker des données, @dataclass génère __init__ pour vous.

Entrées associées

#

Pratiquer dans les leçons

#

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