Heim >Backend-Entwicklung >Python-Tutorial >Häufig gestellte Fragen zum Python-Interview: Der Unterschied zwischen __Init__ und __New__
In einer Python-Klasse definierte Methoden, die mit _ _ xx _ _ enden, sind alle integrierte Methoden der Klasse, auch magische Methoden genannt.
Die integrierten Methoden der Klasse werden automatisch ausgelöst, wenn bestimmte Bedingungen erfüllt sind. Hier konzentrieren wir uns auf die Erläuterung von __init__ und __new__, die sich auf die Instanzerstellung beziehen.
__init__(self): Wir sind mit dieser Methode relativ vertraut. Es handelt sich um die Standardinitialisierungsmethode in Python-Klassen, bei der es sich um eine Methode handelt, die ausgeführt wird, wenn eine Klasse instanziiert wird.
__new__ ist sehr festgelegt und lautet normalerweise wie folgt:
def __new__(cls): return super().__new__(cls)
wobei cls die Klasse selbst darstellt.
Der Code zum Umschreiben der __new__-Methode ist sehr festgelegt: Beim Umschreiben der __new__-Methode müssen Sie super().__new__(cls) oder object.__new__(cls) zurückgeben, sonst kann der Python-Interpreter keine Zuweisung vornehmen Leerzeichen. Objektreferenz, die Initialisierungsmethode des Objekts wird nicht aufgerufen. Zum Beispiel:
class Mycls: def __new__(cls): print('new') return super().__new__(cls) def __init__(self): print('init') my=Mycls()
Ausgabe:
Wir können sehen, dass new vor init ausgegeben wird, was beweist, dass __new__(cls) vor __init__(self) ausgeführt wird.
Wir schreiben den Code neu:
def __new__(cls): print('new') my=Mycls() print(my)
Ausgabe:
Sie können sehen, dass die Instanz nicht zurückgegeben wird, wenn in __new__(cls): kein Rückgabewert vorhanden ist, und __init__(self ) wird nicht ausgeführt .
1 Die Methode __new__() wird zuerst aufgerufen, bevor die Klasse instanziiert wird. Die Methode __init__() wird zum Initialisieren der Instanz verwendet. Diese Methode wird nach der Erstellung des Instanzobjekts aufgerufen. Sie ist eine Methode des Instanzobjekts und wird zum Festlegen einiger Anfangswerte des Klasseninstanzobjekts verwendet.
2. Wenn sowohl die Methode __init__() als auch die Methode __new__() in der Klasse vorkommen, wird zuerst die Methode __new__() und dann die Methode __init__() aufgerufen. Die Methode __new__() ist der erste Schritt beim Erstellen einer Instanz. Nach der Ausführung muss die Instanz der erstellten Klasse zurückgegeben werden. Andernfalls wird ein Fehler gemeldet und die Methode __init__() kann nicht ausgeführt werden. Unter anderem gibt die Methode __init__() keine Informationen zurück.
Einige Schüler werden fragen, was mit __new__ erreicht werden kann?
Persönlich denke ich, dass Singleton die klassischste Anwendung ist. Das Singleton-Muster ist ein häufig verwendetes Software-Entwurfsmuster. Der Hauptzweck dieses Musters besteht darin, sicherzustellen, dass nur eine Instanz einer bestimmten Klasse vorhanden ist. Singleton-Objekte sind praktisch, wenn wir möchten, dass nur eine Instanz einer bestimmten Klasse im gesamten System erscheint. Beispielsweise kann es in einem System mehrere Druckaufgaben geben, es kann jedoch nur eine Arbeitsaufgabe geben. Ein System kann nur einen Fenstermanager oder ein Dateisystem haben.
Der spezifische Implementierungscode lautet wie folgt:
class Mycls: _instance = None def __new__(cls): # 判断该类的属性是否为空;对第一个对象没有被创建,我们应该调用父类的方法,为第一个对象分配空间 if cls._instance == None: # 把类属性中保存的对象引用返回给python的解释器 cls._instance = object.__new__(cls) return cls._instance # 如果cls._instance不为None,直接返回已经实例化了的实例对象 else: return cls._instance def __init__(self): print('init') my1=Mycls() print(my1) my2=Mycls() print(my2)
Ausgabe:
init <__main__.Mycls object at 0x000000406E471148> Init <__main__.Mycls object at 0x000000406E471148>
Sie können sehen, dass sie zwar my1 und my2 heißen, aber beide Objekte 0x000000406E471148 sind. Dies ist die Anwendung des Singleton-Modus.
Das obige ist der detaillierte Inhalt vonHäufig gestellte Fragen zum Python-Interview: Der Unterschied zwischen __Init__ und __New__. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!