Maison >développement back-end >Tutoriel Python >Pourquoi `__init__()` de Python est-il toujours appelé après `__new__()` ?

Pourquoi `__init__()` de Python est-il toujours appelé après `__new__()` ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-18 17:36:10582parcourir

Why is Python's `__init__()` Always Called After `__new__()`?

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 :

  1. __new__() est appelé en premier pour allouer et potentiellement renvoyer un existant instance.
  2. Si __new__() renvoie une nouvelle instance, __init__() est alors appelée pour initialiser l'instance.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn