Aufruf einer übergeordneten Klasse die Methode von der Kind-Klasse in Python?
Beim erstellen einer einfachen Objekt-Hierarchie in Python, ich möchte in der Lage zum aufrufen von Methoden von der übergeordneten Klasse, von der eine abgeleitete Klasse. In Perl und Java, es ist ein Schlüsselwort für diese (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 den Namen der Elternklasse explizit vom Kind.
In dem Beispiel oben, ich hätte etwas zu tun, wie Foo::frotz()
.
Dieser scheint nicht richtig, da dieses Verhalten macht es schwer, zu Tiefe Hierarchien. Wenn Kinder müssen wissen, welche Klasse definiert eine geerbte Methode, dann werden alle Arten von Informationen, die Schmerz erzeugt.
Ist dies eine tatsächliche Einschränkung in python, eine Lücke in meinem Verständnis oder beides?
Während Sie eine option, um den Namen einer Klasse ist keine schlechte Idee, gezwungen zu tun, so sicher ist.
Sich bewusst sein, der Veränderungen in der super-handling zwischen Python 2 und Python 3 https://www.python.org/dev/peps/pep-3135/. Die Benennung der Klasse ist nicht mehr erforderlich (obwohl vielleicht noch ein Gott Idee, zumindest manchmal).
InformationsquelleAutor jjohn | 2009-04-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, aber nur mit new-style-Klassen. Verwenden Sie die
super()
Funktion:Ja, Sie können, aber die OP wurde gefragt, wie es zu tun, ohne ausdrücklich die Benennung der Oberklasse an der call-site (Bar, in diesem Fall).
super() ist komisch mit Mehrfachvererbung. Er fordert die "nächste" Klasse. Das könnte der übergeordneten Klasse, oder vielleicht einige völlig unabhängig von der Klasse, die erscheint an anderer Stelle in der Hierarchie.
Ich verwende Python-2.x und ich erhalte die Meldung "Fehler: Sie müssen geben, nicht classobj" wenn ich dies tun
Die syntax
super(Foo, self)
ist für Python 2.x richtig? In Python 3.x, diesuper()
wird bevorzugt, richtig?InformationsquelleAutor Adam Rosenfield
Python hat auch super:
super(type[, object-or-type])
Beispiel:
InformationsquelleAutor Jay
wird in Ordnung sein, ob der direkt übergeordneten Klasse definiert
frotz
selbst oder es geerbt.super
ist nur erforderlich für die ordnungsgemäße Unterstützung von mehrere Vererbung (und dann funktioniert es nur, wenn jede Klasse nutzt es richtig). Im AllgemeinenAnyClass.whatever
Aussehen wird biswhatever
imAnyClass
's Vorfahren, wennAnyClass
nicht definieren/überschreiben, und das gilt für "das Kind in der Klasse den Aufruf von parent - Methode" ebenso wie für alle anderen vorkommen!was ist, wenn seine Methode einer Klasse?
InformationsquelleAutor Alex Martelli
Python 3 hat eine andere und einfachere syntax für den Aufruf von parent-Methode.
Wenn
Foo
Klasse erbt vonBar
, dann vonBar.__init__
können aufgerufen werden, ausFoo
übersuper().__init__()
:InformationsquelleAutor Arun Ghosh
Viele Antworten haben erklärt, wie das aufrufen einer Methode aus der übergeordneten, die außer Kraft gesetzt wurde, in das Kind.
Jedoch
könnte auch einfach bedeuten:
Aufrufen Sie können geerbte Methoden von einer übergeordneten Klasse, so als wären Sie Methoden der Kind-Klasse, solange Sie noch nicht überschrieben wurden.
z.B. in python 3:
ja, das kann ziemlich offensichtlich, aber ich glaube, ohne näher auf diese Menschen verlassen kann, dieses Thema mit dem Eindruck, den Sie haben zu springen durch lächerlich Reifen nur Zugriff auf geerbte Methoden in python. Vor allem, da diese Frage Preisen hoch in der sucht ", wie Sie Zugang zu einer übergeordneten Klasse die Methode in Python", und die OP ist geschrieben aus der Perspektive von jemand, der neu in python.
Ich gefunden:
https://docs.python.org/3/tutorial/classes.html#inheritance
um nützlich zu sein, zu verstehen, wie Sie Zugriff auf geerbte Methoden.
in welcher situation funktioniert das nicht? Ich bin glücklich, hinzufügen, Vorsichtsmaßnahmen oder Warnungen, die relevant sind, aber ich konnte nicht herausfinden, wie der link, den Sie geschrieben wurde, relevant zu dieser Antwort.
Sorry, habe ich nicht gelesen, Ihre Antwort sorgfältig genug. Diese Antwort keine Antwort auf die Frage, wie der überlastung der Funktionen, aber die Antwort auf eine andere Frage. Ich löschte meinen ersten Kommentar.
ah, keine sorgen. Mir ist klar, dass diese Antwort nicht gelten zu überladen von Funktionen, jedoch ist die Frage nicht explizit erwähnt überlastung (obwohl das perl-Beispiel zeigt einen Fall von überlastung). Die überwiegende Mehrheit der anderen Antworten decken überlastung - diese ist hier für diejenigen, die es nicht brauchen.
was ist, wenn ich anrufen möchte (B).baz() aus einer anderen Klasse mit dem Namen 'C' mit vars definiert, die in C?. Ich habe versucht zu tun, B().baz() in der Klasse C, wo selbst.string ist ein weiterer val. Es gab mir keine, wenn ich ausgeführt
InformationsquelleAutor Ben
Hier ist ein Beispiel für die Verwendung super():
InformationsquelleAutor yesnik
Es ist ein super() in Python auch. Es ist ein bisschen wackelig, weil der Python ' s old - und new-style-Klassen, aber ist ziemlich Häufig verwendet, z.B. in Konstruktoren:
Hoppla... tatsächlich habe ich
InformationsquelleAutor lawrence
Ich würde empfehlen, mit
CLASS.__bases__
so etwas
Bedenken Sie, dass, wie Sie sagen können, aus der Menge von Referenzen auf super hier, die Leute sind wirklich ungern verwenden Grundlagen, es sei denn, Sie tun etwas wirklich tief. Wenn Sie nicht wie super suchen Instandhaltung. Wobei der erste Eintrag im Instandhaltung ist sicherer als die tracking-Eintrag in den Grundlagen zu verwenden. Mehrfachvererbung in Python durchsucht bestimmte Dinge rückwärts und die andere vorwärts, so lassen sich die Sprache erholen, der Prozess ist sichersten.
InformationsquelleAutor Joran Beasley
Wenn Sie nicht wissen, wie viele Argumente, die Sie bekommen könnten, und wollen, Sie alle durch, das Kind als gut:
(Aus: Python - Sauberste Möglichkeit zum überschreiben der __init__, wo eine optionale kwarg muss verwendet werden, nach dem super () - Aufruf?)
InformationsquelleAutor Robin Winslow
Es ist ein super() in python auch.
Beispiel dafür, wie ein super-Klasse-Methode aufgerufen, die eine sub-Klasse Methode
Dieses Beispiel ist ähnlich zu der oben erklärt.Jedoch gibt es ein Unterschied ist, dass super keine Argumente übergeben werden.Dieser obige code ist ausführbar in python 3.4 version.
InformationsquelleAutor kkk
In Python 2, ich hatte nicht viel Glück mit super(). Ich benutzte die Antwort aus
jimifiki auf diesen SO-thread wie finden Sie zu einer übergeordneten Methode in python?.
Dann habe ich meine eigene kleine Wendung, die ich denke, ist eine Verbesserung in der Benutzerfreundlichkeit (vor Allem, wenn Sie lange Klassennamen).
Definieren, die Basis-Klasse in einem Modul:
Dann importieren Sie die Klasse in einer anderen Module
as parent
:class A(object):
stattclass A():
Dann super() funktioniertIch bin mir nicht sicher, ob ich Folgen. Meinst du in der definition der Klasse? Offensichtlich, Sie haben, um anzugeben, dass eine Klasse ein Elternteil hat, irgendwie um zu denken, du könntest zu finden ein Elternteil! Seit ich dies geschrieben vor 9 Monaten, ich bin n bisschen unscharf, die details, aber ich denke, ich meinte die Beispiele von Arun Ghosh, lawrence, kkk usw. nicht anwendbar in Py 2.x. Stattdessen ist hier eine Methode, die funktioniert und einen einfachen Weg zu finden um die Eltern, so ist es ein wenig klarer, was du tust. (wie super)
InformationsquelleAutor BuvinJ
InformationsquelleAutor maryam mehboob
InformationsquelleAutor RAVIKUMAR RACHA
Dies ist eine weitere abstrakte Methode:
Nur um zu verdeutlichen, VERWENDEN Sie DIESEN CODE NICHT. Es Niederlagen der ganze Zweck von super(), die ist richtig durchqueren die Instandhaltung.
stackoverflow.com/a/19257335/419348 sagte, warum nicht nennen
super(self.__class__, self).baz(arg)
.InformationsquelleAutor user806071