Wie kann ich die übergeordneten Klassen einer Python-Klasse abrufen?
201
Verwenden Sie das folgende Attribut:
cls.__bases__
Aus den Dokumenten :
Das Tupel der Basisklassen eines Klassenobjekts.
Beispiel:
>>> str.__bases__
(<type 'basestring'>,)
Ein anderes Beispiel:
>>> class A(object):
... pass
...
>>> class B(object):
... pass
...
>>> class C(A, B):
... pass
...
>>> C.__bases__
(<class '__main__.A'>, <class '__main__.B'>)
type(C()).__bases__
wie unten beschrieben vorWenn Sie alle Vorfahren und nicht nur die unmittelbaren möchten , verwenden Sie inspect.getmro :
Auf diese Weise erhalten Sie alle Vorfahrenklassen in der "Reihenfolge der Methodenauflösung", dh in der Reihenfolge, in der die Vorfahren beim Auflösen einer Methode überprüft werden (oder tatsächlich alle anderen Attribute - Methoden und andere Attribute befinden sich im selben Namespace Immerhin in Python ;-).
quelle
cls.__mro__
(zumindest in Python 3.5)Klassen neuen Stils verfügen über eine von Ihnen aufrufbare mro-Methode, die eine Liste der übergeordneten Klassen in der Reihenfolge der Methodenauflösung zurückgibt.
quelle
object
scheint nicht darauf zu reagierenmro
.x
, können wir die Methode Auflösung , um mit dem Anruf bekommentype(x).mro()
wir , wenn betrachten könnenx
hatClassX
mit als Basisklasse:ClassX in type(x).mro()
Der SCHNELLSTE Weg, um alle Eltern zu sehen, und IN ORDNUNG verwenden Sie einfach die eingebaute
__mro__
dh
repr(YOUR_CLASS.__mro__)
Ausgänge, IN BESTELLUNG
Hier hast du es. Die „beste“ Antwort jetzt hat 182 Stimmen (wie ich dies tippe) , aber das ist so viel einfacher als einig für Schleife gefaltet, Blick in den Basen eine Klasse zu einem Zeitpunkt, nicht zu erwähnen , wenn eine Klasse erweitert zwei oder mehr Eltern Klassen. Durch das Importieren und Verwenden von
inspect
Clouds wird der Bereich unnötig erweitert. Es ist ehrlich gesagt eine Schande, dass die Leute nicht wissen, nur die eingebauten Geräte zu verwendenIch hoffe das hilft!
quelle
inspect.getmro
nur Anrufe__mro__
auf dem Objekt, wie Sie sehen können in github.com/python/cpython/blob/... . Die Verwendunggetmro
erzeugt saubereren und besser lesbaren Code. Das Überspringen eines Funktionsaufrufs ist zwar schneller.Verwenden Sie Basen, wenn Sie nur die Eltern erhalten möchten, und verwenden Sie
__mro__
(wie von @ naught101 hervorgehoben), um die Reihenfolge der Methodenauflösung abzurufen (um zu wissen, in welcher Reihenfolge die Inits ausgeführt wurden).Grundlagen (und zuerst die Klasse für ein vorhandenes Objekt abrufen):
Für mro in neueren Python-Versionen:
Wenn Sie bereits eine Klassendefinition haben, können Sie diese natürlich direkt aufrufen
__mro__
:quelle
Wenn Sie sicherstellen möchten, dass alle aufgerufen werden, verwenden Sie sie
super
auf allen Ebenen.quelle