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
Libérer: 2024-12-19 15:47:11
original
526 Les gens l'ont consulté

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 :

1

2

3

4

5

6

7

8

9

10

11

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

Copier après la connexion

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 de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal