À quoi sert la méthode __new__ ?

La méthode __new__ est une méthode spéciale qui est appelée afin de créer une nouvelle instance d'une classe avant qu'elle soit initialisée.

C'est une méthode statique qui prend la classe en argument et retourne une nouvelle instance de cette dernière.

Elle est responsable de créer l'objet, tandis que la méthode __init__, elle, initialise l'objet.

Elle est principalement utilisée lorsque l'on souhaite contrôler le processus de création de l'objet ou lorsque l'on manipule des classes immuables.

À noter

La méthode __new__ est appelée avant la méthode __init__.

Voici un exemple d'illustration de l'utilisation de __new__ :

class Personne:
    def __new__(cls, name, age):
        print("Création d'un nouvel objet Personne")
        instance = super(Personne, cls).__new__(cls)
        return instance

    def __init__(self, name, age):
        print("Initialisation de l'objet Personne")
        self.name = name
        self.age = age

personne = Personne("Kévin", 20)
print(f"Nom de la personne : {personne.name}, Âge : {personne.age}")
Un instant

Dans cet exemple, la méthode __new__ est définie dans la classe Personne.
Cela va créer une nouvelle instance de la classe en utilisant la fonction super() et la retourne.

On peut ensuite y ajouter une logique pour contrôler la création de notre objet à l'intérieur de notre méthode __new__ si l'on veut.

À noter

Ici on utilise la méthode super couplée à la méthode _new__ pour récupérer le nom de la classe parente.
Dans notre cas, l'interpréteur demande à ce qu'on passe la classe et l'instance en paramètre mais ce n'est plus obligatoire depuis Python 3, vous pouvez retrouver les deux syntaxes d'utilisation ici.

Différences entre __new__ et __init__

La méthode __new__ est une méthode statique, tandis que __init__ est une méthode d'instance.

__new__ est responsable de créer et retourner une nouvelle instance de classe, tandis que __init__ s'occupe d'itinialiser les attributs d'un objet nouvellement créé.

__new__ est appelée et exécutée en premier, avant __init__

__new__ peut retourner n'importe quel objet, tandis que __init__ doit obligatoirement retourner None.

À noter

Il est important de noter que la méthode __new__ est beaucoup moins utilisée comparée à __init__.
Dans la plupart des cas, vous n'aurez qu'à définir la méthode __init__ pour initialiser l'objet avec les attributs désirés.

Mais alors, quand utiliser __new__ ?

On va utiliser __new__ lorsque l'on souhaite controler le processus de création d'un objet, par exemple :

  • Lorsque l'on veut vérifier qu'un objet est d'un certain type

  • Définir l'état initial d'un objet

  • Empêcher l'objet d'être créé

Un exemple d'un cas concret d'utilisation de la méthode __new__ serait la création d'un Singleton.

La méthode __new__ est redéfinie pour vérifier si une instance existe déjà. Si ce n'est pas le cas, elle en crée une nouvelle. Sinon, elle retourne l'instance existante.

class Singleton:
    _instance = None
    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            print("Création de la première instance")
            cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)

        return cls._instance

mon_singleton = Singleton()
mon_singleton = Singleton()
Un instant

Bravo, tu es prêt à passer à la suite

Rechercher sur le site

Formulaire de contact

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.