Heim >Backend-Entwicklung >Python-Tutorial >Warum wird „__init__()' bei der Objekterstellung in Python immer nach „__new__()' aufgerufen?

Warum wird „__init__()' bei der Objekterstellung in Python immer nach „__new__()' aufgerufen?

DDD
DDDOriginal
2024-12-19 15:47:11471Durchsuche

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

"__init__()" und "__new__()": Reihenfolge und Zweck

"__init__()" und "__new__()" sind grundlegende Methoden in der objektorientierten Programmierung von Python, die zur Steuerung der Instanzerstellung und -initialisierung verwendet werden.

"__new__()" ist verantwortlich für Zuweisen von Speicher und Erstellen einer neuen Instanz einer Klasse, Zurückgeben des neu erstellten Objekts. Es ist für die eigentliche Erstellung einer Instanz verantwortlich.

Im Gegensatz dazu initialisiert „__init__()“ die neu erstellte Instanz. Es ist dafür verantwortlich, die Attribute der Instanz einzurichten und alle notwendigen Aktionen durchzuführen, um das Objekt für die Verwendung vorzubereiten.

Pythons Design schreibt vor, dass „__init__()“ im Instanzerstellungsprozess immer nach „__new__()“ aufgerufen wird . Dies liegt daran, dass die neue Instanz nach ihrer Erstellung initialisiert werden muss.

Flyweight-Muster und „__init__()“-Aufruf

Im Kontext des Flyweight-Musters , sind Sie möglicherweise verwirrt über das erwartete Verhalten des Aufrufs von „__init__()“ nach „__new__()“. Dies liegt daran, dass das Flyweight-Muster normalerweise „__new__()“ verwendet, um die Instanzerstellung zu steuern und die Erstellung mehrerer Kopien desselben Objekts zu vermeiden.

In Ihrem Beispielcode haben Sie eine benutzerdefinierte „__new__()“-Methode implementiert Behandeln Sie die Instanzerstellung basierend auf der Existenz eines Schlüssels in einem Wörterbuch. Möglicherweise haben Sie jedoch beabsichtigt, die Methode „__init__()“ nur einmal aufzurufen, auch für nachfolgende Instanzen, die mit dem Flyweight-Muster erstellt wurden.

Warum wird „__init__()“ immer nach „ aufgerufen? __new__()"?

Der Grund für dieses Verhalten ist, dass das objektorientierte System von Python erwartet, dass jede erstellte Instanz durch den Aufruf von initialisiert wird „__init__()“. Dies ist ein grundlegender Teil des Instanzerstellungsprozesses und stellt sicher, dass das Objekt vollständig für die Verwendung vorbereitet ist.

Alternative Implementierung

Um das Flyweight-Muster zu implementieren und den Aufruf von „ zu vermeiden __init__()“ mehrmals ausführen, sollten Sie eine Factory-Klasse verwenden, anstatt „__new__()“ zu überschreiben. Dies wird als robusterer und standardmäßigerer Ansatz angesehen.

Hier ist ein Beispiel für eine Factory-basierte Flyweight-Implementierung:

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

In dieser Implementierung erstellt und speichert die Factory-Klasse Instanzen basierend auf a Schlüssel, wodurch die Notwendigkeit mehrerer „__init__()“-Aufrufe vermieden wird.

Das obige ist der detaillierte Inhalt vonWarum wird „__init__()' bei der Objekterstellung in Python immer nach „__new__()' aufgerufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn