[PYTHON] Verwendung zum Aufrufen einer Methode einer Instanz, bevor sie von __new__ zurückgegeben wird

__new__ ist ein Konstruktor, der eine neue Instanz dieser Klasse erstellt, und __init__ ist, wie der Name schon sagt, ein Initialisierer zum Anpassen einer neu erstellten Instanz. Dieses offizielle Python-Dokumentに説明されているとおり、__init__は、__new__が作成したインスタンスを、呼び出し元に返される前にselfとして受け取ります。

Selbst innerhalb von "new" scheint es an diesem Punkt möglich zu sein, die Instanzmethode zu verwenden, wenn die Instanz bereits erstellt wurde.

Rufen Sie im folgenden Beispielcode unmittelbar nach dem Erstellen einer Instanz von Foo mit object .__ new __ in Foo .__ new __ sofort die Instanzmethode Early_call auf und setzen Sie die Instanzvariable self.arg. Ich habe es erstellt, kann es aber ordnungsgemäß ausführen.

python


class Foo:

    def __new__(cls, arg):
        instance = object.__new__(cls)
        instance.early_call(arg)
        return instance
                 
    def __init__(self, arg):
        print(self.arg)

    def early_call(self, arg):
        self.arg = arg

foo = Foo("I'm foo.")    # I'm foo.Wird ausgegeben.

Tatsächlich verwendet die Implementierung von pandas MultiIndex diese Verwendung. Ich werde.

Recommended Posts

Verwendung zum Aufrufen einer Methode einer Instanz, bevor sie von __new__ zurückgegeben wird
So erstellen Sie eine Instanz einer bestimmten Klasse aus dict mit __new__ () in Python
[Python] Was ist ein Slice? Eine leicht verständliche Erklärung zur Verwendung anhand eines konkreten Beispiels
Ist es möglich, ein Pre-Listing-Unternehmen zu gründen und mit Aktienoptionen ein Vermögen zu machen?
Was ist die Newton-Methode? ?? Ungefähre Lösung der nach der Newton-Methode zu lösenden Gleichung
Eine einfache Möglichkeit, die Verarbeitungsgeschwindigkeit einer von Linux erkannten Festplatte zu messen
Nehmen Sie eine Instanz einer Python-Ausnahmeklasse nicht direkt als Argument für die Ausnahmeklasse!
Bluemix-Script zum Abbrechen einer Instanz von IaaS (ehemals SoftLayer)
So stellen Sie eine Go-Anwendung auf einer ECS-Instanz bereit
Die Kopiermethode von pandas.DataFrame ist standardmäßig Deep Copy
Python (2) erfordert self, da die Methode eine Instanzmethode ist
Ich habe eine Klasse erstellt, um zu überprüfen, ob es sich um einen Bestandteil von TOPIX Core30, Large70, Mid400, Small handelt
Erstellen Sie ein zweidimensionales Array, indem Sie am Ende eines leeren Arrays mit numpy eine Zeile hinzufügen