2016-07-09 18 views
2

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

+0

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? –

+0

@Rogalski Eine weitere Abfrage hinzugefügt, siehe oben. – abc

+0

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. –

Antwort

-2

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.

0

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.

+2

Bitte erklären Sie die downvotes! – Wombatz