Konstruktion (__new__) und Initialisierung (__init__)

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.

0c41739cbc728401d6b87605a65a7e9.png

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.


Weiter lernen
||
einreichenCode zurücksetzen