Heim >Backend-Entwicklung >Python-Tutorial >Warum wird Pythons „__init__()' immer nach „__new__()' aufgerufen?
Verstehen der Reihenfolge von __init__() und __new__()
In Python spielen die Methoden __new__() und __init__() eine entscheidende Rolle im Instanzerstellungsprozess. Viele Entwickler fragen sich jedoch, warum __init__() immer nach __new__() aufgerufen wird.
Zweck von __new__()
__new__() ist für die Steuerung der Erstellung von verantwortlich eine neue Instanz. Es initialisiert die Zuordnung der Instanz und gibt die Instanz selbst zurück. Im Wesentlichen entscheidet __new__(), ob eine neue Instanz erstellt oder eine vorhandene wiederverwendet wird.
Zweck von __init__()
__init__() wird für die Objektinitialisierung verwendet. Es legt die Attribute der Instanz fest und führt den erforderlichen Setup-Code aus. __init__() gibt nichts zurück, da sein Hauptzweck darin besteht, den Zustand des Objekts zu initialisieren.
Reihenfolge bei der Instanzerstellung
Die Reihenfolge bei der Instanzerstellung ist immer:
Beispiel
Das folgende Beispiel veranschaulicht, wie __new__() die Instanz steuert Erstellung:
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()
Ausgabe:
NEW INIT EXISTS INIT EXISTS INIT
Wie Sie sehen können, prüft __new__() zunächst, ob in _dict bereits eine Instanz vorhanden ist. Wenn ja, wird die vorhandene Instanz zurückgegeben. Andernfalls wird eine neue Instanz erstellt und zurückgegeben. __init__() wird dann aufgerufen, um jede Instanz zu initialisieren.
Alternativen zur Verwendung von __new__()
In den meisten Fällen verwenden Sie __new__(), um Ihr eigenes Flyweight-Entwurfsmuster zu implementieren wird nicht empfohlen. Erwägen Sie stattdessen die Verwendung einer Factory-Klasse oder eines Objektpools, um die Erstellung und Wiederverwendung von Instanzen zu verwalten.
Das obige ist der detaillierte Inhalt vonWarum wird Pythons „__init__()' immer nach „__new__()' aufgerufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!