À quoi sert la méthode __init__ ?

La méthode __init__ est une méthode spéciale qui est appelée lors de la création d'une instance.

Elle sert à initialiser un certain nombre d'attributs et à effectuer des opérations lors de l'instanciation d'une classe :

class Person:
    def __init__(self, prenom, nom, age):
        print("Initialisation de l'instance", self)
        self.prenom = prenom
        self.nom = nom
        self.age = age
        self.nationalite = "français"

patrick = Person(prenom="Patrick", nom="Michaud", age=27)
print(patrick.prenom, patrick.nom)
print(patrick.nationalite)

La méthode __init__ est une méthode spéciale, elle doit par exemple obligatoirement retourner None.

Vous ne pouvez donc pas utiliser l'instruction return à l'intérieur de cette méthode (à moins de retourner explicitement None) :

class Person:
    def __init__(self, prenom, nom, age):
        print("Initialisation de l'instance", self)
        self.prenom = prenom
        self.nom = nom
        self.age = age
        self.nationalite = "français"
        return self.nationalite

# TypeError: __init__() should return None, not 'str'
patrick = Person(prenom="Patrick", nom="Michaud", age=27)

On peut donc retourner None sans obtenir d'erreur, mais cela n'a pas vraiment d'intérêt :

class Person:
    def __init__(self, prenom, nom, age):
        print("Initialisation de l'instance", self)
        self.prenom = prenom
        self.nom = nom
        self.age = age
        self.nationalite = "français"
        return None

patrick = Person(prenom="Patrick", nom="Michaud", age=27)