Construction (__new__) et initialisation (__init__)

Grâce au contenu de l'article précédent, nous savons déjà que lors de la définition d'une classe, nous utilisons souvent la méthode __init__(self) pour définir les attributs lors de l'instanciation de l'objet. Par exemple, l'exemple suivant :

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
class User(object):
    def __init__(self, name, age):
        self.name = name;
        self.age = age;
user=User('两点水',23)

En fait, le processus de création d'une classe est divisé en deux étapes. L'une consiste à créer l'objet de la classe et l'autre à initialiser la classe. __new__ est utilisé pour créer une classe et renvoyer une instance de cette classe, tandis que __init__ initialise simplement l'instance avec les paramètres passés. __new__ sera certainement appelé pendant le processus de création d'une instance, mais __init__ ne sera pas nécessairement appelé, par exemple via. pickle Lors de la désérialisation d'une instance à l'aide de .load, la méthode __init__ ne sera pas appelée.

0c41739cbc728401d6b87605a65a7e9.png

def __new__(cls) est appelée avant la méthode def __init__(self), et sa fonction est de renvoyer un objet instance. Une autre chose à noter est que la méthode __new__ doit toujours renvoyer une instance de la classe, et __init__ ne peut renvoyer aucune valeur sauf None

Exemple spécifique :

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
class User(object):
    def __new__(cls, *args, **kwargs):
        # 打印 __new__方法中的相关信息
        print('调用了 def __new__ 方法')
        print(args)
        # 最后返回父类的方法
        return super(User, cls).__new__(cls)
    def __init__(self, name, age):
        print('调用了 def __init__ 方法')
        self.name = name
        self.age = age
if __name__ == '__main__':
    usr = User('两点水', 23)

Regardez le résultat de sortie :

调用了 def __new__ 方法
('两点水', 23)
调用了 def __init__ 方法

En imprimant À en juger par les résultats , nous pouvons savoir à quoi ressemble le processus de création d'une classe. Tout d'abord, la méthode __new__ est appelée pour créer un objet et les paramètres sont transmis à la méthode __init__ pour l'instanciation.

En fait, dans le développement actuel, la méthode __new__ est rarement utilisée sauf si vous souhaitez pouvoir contrôler la création d'une classe. Habituellement, quand on parle de __new__, tout implique une métaclasse.

Bien sûr, lorsque le cycle de vie d'un objet se termine, la méthode destructeur __del__ sera appelée. Mais cette méthode est utilisée par Python lui-même pour récupérer les objets.


Formation continue
  • Recommandations de cours
  • Téléchargement du didacticiel