Durch den Inhalt des vorherigen Artikels wissen wir bereits, dass wir beim Definieren einer Klasse häufig die Methode __init__(self) verwenden, um Attribute festzulegen, wenn das Objekt instanziiert wird. Zum Beispiel das folgende Beispiel:
#!/usr/bin/env python3 # -*- coding: UTF-8 -*- class User(object): def __init__(self, name, age): self.name = name; self.age = age; user=User('两点水',23)
Tatsächlich ist der Prozess der Klassenerstellung in zwei Schritte unterteilt: Der eine besteht darin, das Objekt der Klasse zu erstellen, und der andere darin, die Klasse zu initialisieren. __new__ wird verwendet, um eine Klasse zu erstellen und eine Instanz dieser Klasse zurückzugeben, während __init__ die Instanz lediglich mit den übergebenen Parametern initialisiert. __new__ wird definitiv während des Prozesses der Erstellung einer Instanz aufgerufen, __init__ wird jedoch nicht unbedingt aufgerufen, z. B. durch pickle Beim Deserialisieren einer Instanz mit .load wird die Methode __init__ nicht aufgerufen.
def __new__(cls) wird vor der def __init__(self)-Methode aufgerufen und hat die Funktion, ein Instanzobjekt zurückzugeben. Beachten Sie außerdem, dass die Methode __new__ immer eine Instanz der Klasse zurückgeben muss und __init__ keinen Wert außer None zurückgeben kann.
Spezifisches Beispiel:
#!/usr/bin/env python3 # -*- coding: UTF-8 -*- class User(object): def __new__(cls, *args, **kwargs): # 打印 __new__方法中的相关信息 print('调用了 def __new__ 方法') print(args) # 最后返回父类的方法 return super(User, cls).__new__(cls) def __init__(self, name, age): print('调用了 def __init__ 方法') self.name = name self.age = age if __name__ == '__main__': usr = User('两点水', 23)
Sehen Sie sich die Ausgabe an. Das Ergebnis:
调用了 def __new__ 方法 ('两点水', 23) 调用了 def __init__ 方法
Anhand der gedruckten Ergebnisse können wir erkennen, wie der Prozess zum Erstellen einer Klasse aussieht. Zuerst wird __new__ aufgerufen -Methode zum Erstellen eines Objekts und übergibt Parameter zur Instanziierung an die __init__-Methode.
Tatsächlich wird die __new__-Methode in der tatsächlichen Entwicklung selten verwendet, es sei denn, Sie möchten die Erstellung einer Klasse steuern können. Wenn es um __new__ geht, geht es normalerweise um Metaklassen.
Wenn der Lebenszyklus eines Objekts endet, wird natürlich die Destruktormethode __del__ aufgerufen. Diese Methode wird jedoch von Python zum Garbage Collection-Objekten verwendet.