Maison >développement back-end >Tutoriel Python >Pourquoi `__init__()` est-il toujours appelé après `__new__()` dans la création d'objets Python ?

Pourquoi `__init__()` est-il toujours appelé après `__new__()` dans la création d'objets Python ?

DDD
DDDoriginal
2024-12-19 15:47:11516parcourir

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

"__init__()" et "__new__()" : séquence et objectif

"__init__()" et "__new__()" sont des méthodes fondamentales de la programmation orientée objet de Python utilisées pour contrôler la création et l'initialisation des instances.

"__new__()" est responsable de allouer de la mémoire et créer une nouvelle instance d'une classe, renvoyant l'objet nouvellement créé. Il est responsable de la création proprement dite d'une instance.

En revanche, "__init__()" initialise l'instance nouvellement créée. Il est responsable de la configuration des attributs de l'instance et de l'exécution de toutes les actions nécessaires pour préparer l'objet à l'utilisation.

La conception de Python stipule que "__init__()" est toujours appelé après "__new__()" dans le processus de création de l'instance. . En effet, la nouvelle instance doit être initialisée après sa création.

Modèle Flyweight et invocation "__init__()"

Dans le contexte du modèle Flyweight , vous pourriez être confus quant au comportement attendu de "__init__()" appelé après "__new__()". En effet, le modèle Flyweight utilise généralement "__new__()" pour contrôler la création d'instances et éviter de créer plusieurs copies du même objet.

Dans votre exemple de code, vous avez implémenté une méthode personnalisée "__new__()" pour gérer la création d'instances basée sur l'existence d'une clé dans un dictionnaire. Cependant, vous aviez peut-être prévu que la méthode "__init__()" ne soit appelée qu'une seule fois, même pour les instances ultérieures créées à l'aide du modèle Flyweight.

Pourquoi "__init__()" est-il toujours appelé après " __new__()"?

La raison de ce comportement est que le système orienté objet de Python s'attend à ce que chaque instance créée soit initialisée via l'appel à "__init__()". Il s'agit d'une partie fondamentale du processus de création d'instance, garantissant que l'objet est entièrement préparé pour l'utilisation.

Implémentation alternative

Pour implémenter le modèle Flyweight et éviter d'appeler " __init__()" plusieurs fois, vous devez utiliser une classe d'usine au lieu de remplacer "__new__()". Ceci est considéré comme une approche plus robuste et standard.

Voici un exemple d'implémentation Flyweight basée sur une usine :

class FlyweightFactory:
    _cache = {}

    def __get(key):
        if key not in FlyweightFactory._cache:
            FlyweightFactory._cache[key] = Flyweight(key)
        return FlyweightFactory._cache[key]

class Flyweight:
    def __init__(self, key):
        self.key = key

Dans cette implémentation, la classe d'usine crée et met en cache des instances basées sur un clé, évitant ainsi le besoin de plusieurs appels "__init__()".

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