Maison >développement back-end >Tutoriel Python >Pourquoi `__init__()` est-il toujours appelé après `__new__()` dans la création d'objets Python ?
"__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!