was bedeutet `super()` in `__new__`

Hinweis: Teil eines flyweight-Implementierung mit Python

import weakref

class CarModel:
    _models = weakref.WeakValueDictionary()

    def __new__(cls, model_name, *args, **kwargs):
        model = cls._models.get(model_name)
        if not model:
            model = super().__new__(cls)
            cls._models[model_name] = model    
        return model

    def __init__(self, model_name, air=False):
        if not hasattr(self, "initted"):
          self.model_name = model_name
          self.air = air
          self.initted=True

Frage 1> was ist super() bedeuten? Bedeutet es die Eltern-Klasse CarModel?

Frage 2> ich habe auch Schwierigkeiten zu verstehen, wie die Funktion __new__ funktioniert? Insbesondere die folgende Zeile.

model = super().__new__(cls)

Beschreibung für __new__:

Konstruktor-Funktion aufgerufen wird __new__ im Gegensatz zu __init__, und
akzeptiert genau ein argument, die Klasse, die konstruiert wird (es
wird aufgerufen, bevor das Objekt erstellt wird, so dass es kein selbst gibt,
argument). Es hat auch zur Rückkehr des neu erstellten Objekts.

  • basiert auf der Dokument, __new__() gibt eine Instanz cls. warum der code model = super().__new__(cls) im OP erstellen eine Instanz der cls? Wie funktioniert die super-Klasse von CarModel wissen, wie man erstellen Sie eine Instanz der Unterklasse?
  • Das wäre eine große Frage ALSO auf eigene (falls es nicht schon gefragt worden). Die kurze Antwort ist, dass Sie übergeben Sie die aktuelle Klasse mit der cls parameter. Letztendlich gibt es keinen Weg, um tatsächlich eine neue Instanz erstellen, ohne aufzuschieben, den ganzen Weg zurück zu object.__new__, weil Python besitzt keine Anweisung für die "Zuweisung einer Instanz". Aber object.__new__ weiß, zum erstellen einer Instanz der Klasse übergeben (das wird auch eine Instanz von object, denn alles ist eine Instanz von object).
InformationsquelleAutor q0987 | 2012-01-29
Schreibe einen Kommentar