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