Comprendre la séquence de __init__() et __new__()
En Python, les méthodes __new__() et __init__() jouent un rôle crucial dans le processus de création d'instance. Cependant, de nombreux développeurs se demandent pourquoi __init__() est toujours appelé après __new__().
Objectif de __new__()
__new__() est chargé de contrôler la création de une nouvelle instance. Il initialise l'allocation de l'instance et renvoie l'instance elle-même. Essentiellement, __new__() décide s'il faut créer une nouvelle instance ou réutiliser une instance existante.
Objectif de __init__()
__init__() est utilisé pour l'initialisation de l'objet. Il définit les attributs de l'instance et exécute tout code de configuration nécessaire. __init__() ne renvoie rien, car son objectif principal est d'initialiser l'état de l'objet.
Séquence de création d'instance
La séquence de création d'instance est toujours :
Exemple
L'exemple suivant illustre comment __new__() contrôle l'instance création :
class A(object): _dict = dict() def __new__(cls): if 'key' in A._dict: print("EXISTS") return A._dict['key'] else: print("NEW") return super(A, cls).__new__(cls) def __init__(self): print("INIT") A._dict['key'] = self print("") a1 = A() a2 = A() a3 = A()
Sortie :
NEW INIT EXISTS INIT EXISTS INIT
Comme vous pouvez le voir, __new__() vérifie d'abord si une instance existe déjà dans _dict. Si tel est le cas, il renvoie cette instance existante. Sinon, il crée une nouvelle instance et la renvoie. __init__() est ensuite appelé pour initialiser chaque instance.
Alternatives à l'utilisation de __new__()
Dans la plupart des cas, utiliser __new__() pour implémenter votre propre modèle de conception de poids mouche n’est pas recommandé. Envisagez plutôt d'utiliser une classe d'usine ou un pool d'objets pour gérer la création et la réutilisation des instances.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!