781 Stimmen

Wie rufe ich die Methode einer Elternklasse von einer Kindklasse in Python auf?

Bei der Erstellung einer einfachen Objekthierarchie in Python möchte ich die Methoden der übergeordneten Klasse von einer abgeleiteten Klasse aus aufrufen können. In Perl und Java gibt es dafür ein Schlüsselwort ( super ). In Perl könnte ich dies tun:

package Foo;

sub frotz {
    return "Bamf";
}

package Bar;
@ISA = qw(Foo);

sub frotz {
   my $str = SUPER::frotz();
   return uc($str);
}

In Python scheint es, dass ich die übergeordnete Klasse explizit nach der untergeordneten benennen muss. In dem obigen Beispiel müsste ich etwas tun wie Foo::frotz() .

Dies scheint nicht richtig zu sein, da dieses Verhalten es schwierig macht, tiefe Hierarchien zu erstellen. Wenn Kinder wissen müssen, welche Klasse eine geerbte Methode definiert hat, entstehen alle Arten von Informationsschmerzen.

Ist dies eine tatsächliche Einschränkung in Python, eine Lücke in meinem Verständnis oder beides?

3 Stimmen

Ich denke, dass die Benennung der übergeordneten Klasse keine so schlechte Idee ist. Es kann hilfreich sein, wenn die Kindklasse von mehr als einer Elternklasse erbt, da Sie die Elternklasse explizit benennen.

8 Stimmen

Die Möglichkeit, eine Klasse zu benennen, ist zwar keine schlechte Idee, aber dazu gezwungen zu werden, ist es schon.

0 Stimmen

Beachten Sie die Änderungen in der Superbehandlung zwischen Python 2 und Python 3 https://www.python.org/dev/peps/pep-3135/ . Die Benennung der Klasse ist nicht mehr erforderlich (obwohl sie zumindest manchmal immer noch eine gute Idee sein kann).

-2voto

class a(object):
    def my_hello(self):
        print "hello ravi"

class b(a):
    def my_hello(self):
    super(b,self).my_hello()
    print "hi"

obj = b()
obj.my_hello()

5 Stimmen

Willkommen bei stackoverflow. Diese Frage wurde bereits vor fast zehn Jahren ausführlich beantwortet, die Antwort wurde akzeptiert und größtenteils hochgestuft, und Ihre Antwort fügt nichts Neues hinzu. Vielleicht sollten Sie stattdessen versuchen, neuere (und vorzugsweise unbeantwortete) Fragen zu beantworten. Nebenbei bemerkt gibt es im Editor eine Schaltfläche, mit der Sie den Code richtig formatieren können.

-26voto

user806071 Punkte 1

Dies ist eine eher abstrakte Methode:

super(self.__class__,self).baz(arg)

15 Stimmen

Self.__class__ funktioniert nicht richtig mit super, da self immer die Instanz ist und seine Klasse ist immer die Klasse der Instanz. Das bedeutet, wenn Sie super(self.__class__ in einer Klasse verwenden und diese Klasse geerbt ist von, wird es nicht mehr funktionieren.

16 Stimmen

Um es noch einmal zu betonen: VERWENDEN SIE DIESEN CODE NICHT. Er macht den gesamten Zweck von super() zunichte, der darin besteht, die MRO korrekt zu durchlaufen.

1 Stimmen

stackoverflow.com/a/19257335/419348 sagte, warum nicht anrufen super(self.__class__, self).baz(arg) .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X