Warum erbt die untergeordnete Klasse in diesem Beispiel nicht die Methode von der übergeordneten Klasse in Python?

8

Ich habe den folgenden Code.

%Vor%

Ich bekomme diesen Fehler:

%Vor%

Warum wird die foo -Methode nicht in Bar übernommen?

BEARBEITEN: Es funktioniert gut, wenn du super anrufst, was auskommentiert ist.

    
brain storm 27.09.2013, 04:04
quelle

3 Antworten

7

Die doppelten Unterstrichattribute haben ihre Namen gemangelt basierend auf dem aktuellen / enthaltenden -Namespace. In der Funktion foo ist der aktuelle Namespace Foo . Wenn Python also nach self.__baz sucht, sucht er tatsächlich nach self._Foo__baz aufgrund des Namens-Mangling-Schemas. Da nirgendwo in Foo tatsächlich ein __baz -Attribut gesetzt wurde, hat die Klasse kein _Foo__baz -Attribut (es hat ein _Bar__baz -Attribut, da Sie self.__baz in einer Methode innerhalb von Bar gesetzt haben).

Natürlich, wie Sie vielleicht bemerkt haben, wenn Sie Foo.__init__(self) in Baz.__init__ aufrufen (direkt oder über super ), wird das Problem verschwinden, weil Foo.__init__ sets __baz (dh _Foo__baz ).

    
mgilson 27.09.2013, 04:11
quelle
3

Wenn Sie Variablen mit doppeltem Unterstrich wie in Python benennen, wird der Name des Mitglieds verschleiert. Wenn Sie __baz deklarieren, erhalten Sie ein Mitglied _Bar__baz .

%Vor%     
Aesthete 27.09.2013 04:10
quelle
2

Mit den ersten doppelten Unterstrichen auf __baz haben Sie "name mangling" angefordert, um eine "private" Variable zu erstellen. Es ist hier dokumentiert:

Ссылка

Wenn Sie den Namen von __baz in nur baz ändern, funktioniert Ihr Code wie gezeigt.

    
steveha 27.09.2013 04:11
quelle

Tags und Links