Warum ist das Attribut für super
Objekt nicht aufgeführt? Da das Attribut nicht aufgeführt ist, wie ist super
Objekt ss
in der Lage, aaa()
in der Klasse Mysuper
aufrufen?Attribute des Superobjekts
Antwort
Wenn du self an super übergibst (Mysub, self), bindst du dich selbst als Instanz der Superklasse. Wenn Sie sich selbst auslassen, werden Sie aaa nicht als Attribut sehen.
Methoden sind in der Klasse dict enthalten, nicht in der Instanz dict.
sehen:
class C:
def method(self): pass
print(C().__dict__) # prints {}
print(C.__dict__) # prints a lot of stuff plus the method
Die Vererbung keine Rolle spielt.
Mit super
:
super
: ein Proxy-Objekt zurück, dass die Delegierten Methode zu einem Elternteil oder Geschwister Klasse aufruft
Mit super(SomeType, some_instance)
erhalten Sie einen Proxy für den Objekt, nicht die Geben Sie ein. Wenn Sie also dir
auf diesem Proxy-Objekt aufrufen, erhalten Sie das Instanz-Dict des Super-Objekts, das keine Ihrer definierten Methoden oder Attribute enthält und das Attribut __dict__
zeigt nur die Instanzattribute des Objekts hinter dem Proxy. Die Methoden sind stattdessen wieder auf der Klasse dict des Objekts hinter diesem Proxy.
Bitte erklären Sie die downvotes! – Wombatz
Warum sollten Sie erwarten, dass es ein 'aaa' Attribut hat? Sie haben bereits festgestellt, dass 'ss' weder' Mysuper'-Klasse noch deren Instanz ist, sondern eine Instanz von ''. Warum sollte 'super' Instanz ein' aaa' Mitglied haben? –
@Rogalski Eine weitere Abfrage hinzugefügt, siehe oben. – abc
es ist im Grunde eine "__getattribute__" Magie. [Benutze die Quelle, Luke!] (Https://github.com/python/cpython/blob/master/Objects/typeobject.c#L7393). 'Super_getattro' ist was du willst. –