Wenn Sie eine einfache Objekthierarchie in Python erstellen, möchte ich Methoden der übergeordneten Klasse aus einer abgeleiteten Klasse aufrufen können. In Perl und Java gibt es ein Schlüsselwort für this ( super
). In Perl könnte ich Folgendes 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 vom untergeordneten benennen muss. Im obigen Beispiel müsste ich so etwas tun 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 Informationsschmerz.
Ist dies eine tatsächliche Einschränkung in Python, eine Lücke in meinem Verständnis oder beides?
python
inheritance
class
object
jjohn
quelle
quelle
Antworten:
Ja, aber nur mit neuen Klassen . Verwenden Sie die
super()
Funktion:Verwenden Sie für Python <3:
quelle
super(Foo, self)
ist für Python 2.x richtig? In Python 3.x ist dassuper()
bevorzugt richtig?Python hat auch super :
super(type[, object-or-type])
Beispiel:
quelle
wird in Ordnung sein, ob die unmittelbare übergeordnete Klasse sich
frotz
selbst definiert oder geerbt hat.super
wird nur für die ordnungsgemäße Unterstützung der Mehrfachvererbung benötigt (und funktioniert dann nur, wenn jede Klasse sie ordnungsgemäß verwendet). Im AllgemeinenAnyClass.whatever
wirdwhatever
inAnyClass
den Vorfahren nachgeschlagen, wennAnyClass
es nicht definiert / überschrieben wird, und dies gilt für "untergeordnete Klasse, die die Methode der Eltern aufruft" wie für jedes andere Vorkommen!quelle
parent
, liegt sie im Umfang der gesamten Klasse, nicht wahr ?Python 3 hat eine andere und einfachere Syntax zum Aufrufen der übergeordneten Methode.
Wenn die
Foo
Klasse von erbtBar
,Bar.__init__
kann from vonFoo
via aufgerufen werdensuper().__init__()
:quelle
In vielen Antworten wurde erklärt, wie eine Methode vom Elternteil aufgerufen wird, die im Kind überschrieben wurde.
jedoch
könnte auch nur bedeuten:
Sie können Methoden aufrufen, die von einer übergeordneten Klasse geerbt wurden, als wären sie Methoden der untergeordneten Klasse, sofern sie nicht überschrieben wurden.
zB in Python 3:
Ja, das mag ziemlich offensichtlich sein, aber ich glaube, ohne darauf hinzuweisen, können die Leute diesen Thread mit dem Eindruck verlassen, dass man durch lächerliche Reifen springen muss, um auf geerbte Methoden in Python zuzugreifen. Zumal diese Frage bei der Suche nach "Zugriff auf die Methode einer übergeordneten Klasse in Python" einen hohen Stellenwert hat und das OP aus der Perspektive einer neuen Python-Person geschrieben wurde.
Ich fand: https://docs.python.org/3/tutorial/classes.html#inheritance hilfreich, um zu verstehen, wie Sie auf geerbte Methoden zugreifen.
quelle
self.string
bewirkt nichts. In der Klasse C konnte man jedoch noch anrufenB().bar(string)
Hier ist ein Beispiel für die Verwendung von super () :
quelle
Es gibt auch ein super () in Python. Es ist ein bisschen wackelig, wegen Pythons Klassen im alten und neuen Stil, wird aber ziemlich häufig verwendet, z. B. in Konstruktoren:
quelle
Ich würde empfehlen, so
CLASS.__bases__
etwas zu verwendenquelle
Wenn Sie nicht wissen, wie viele Argumente Sie möglicherweise erhalten, und diese auch an das Kind weitergeben möchten:
(Von: Python - Sauberste Methode zum Überschreiben von __init__, wobei nach dem Aufruf von super () ein optionales kwarg verwendet werden muss? )
quelle
Es gibt auch ein super () in Python.
Beispiel dafür, wie eine Superklassenmethode von einer Unterklassenmethode aufgerufen wird
Dieses Beispiel ähnelt dem oben erläuterten. Es gibt jedoch einen Unterschied, an den super keine Argumente übergeben werden. Dieser obige Code ist in der Python 3.4-Version ausführbar.
quelle
In diesem Beispiel
cafec_param
handelt es sich um eine Basisklasse (übergeordnete Klasse) undabc
eine untergeordnete Klasse.abc
ruft dieAWC
Methode in der Basisklasse auf.Ausgabe
quelle
In Python 2 hatte ich mit super () nicht viel Glück. Ich habe die Antwort von jimifiki in diesem SO-Thread verwendet , um auf eine übergeordnete Methode in Python zu verweisen.. Dann habe ich meine eigene kleine Wendung hinzugefügt, die meiner Meinung nach eine Verbesserung der Benutzerfreundlichkeit darstellt (insbesondere, wenn Sie lange Klassennamen haben).
Definieren Sie die Basisklasse in einem Modul:
Importieren Sie dann die Klasse in ein anderes Modul
as parent
:quelle
class A(object):
anstelle vonclass A():
Dann wird super () funktionierenquelle
quelle
Dies ist eine abstraktere Methode:
quelle
super(self.__class__, self).baz(arg)
.