Wie kann ich die übergeordneten Klassen einer Python-Klasse abrufen?
Wie kann ich die übergeordneten Klassen einer Python-Klasse abrufen?
Antworten:
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'>)
Wenn Sie alle Vorfahren und nicht nur die unmittelbaren möchten , verwenden Sie inspect.getmro :
import inspect
print inspect.getmro(cls)
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 ;-).
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.
object
scheint nicht darauf zu reagieren mro
.
x
, können wir die Methode Auflösung , um mit dem Anruf bekommen type(x).mro()
wir , wenn betrachten können x
hat ClassX
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__)
>>>
>>>
>>> import getpass
>>> getpass.GetPassWarning.__mro__
Ausgänge, IN BESTELLUNG
(<class 'getpass.GetPassWarning'>, <type 'exceptions.UserWarning'>,
<type 'exceptions.Warning'>, <type 'exceptions.Exception'>,
<type 'exceptions.BaseException'>, <type 'object'>)
>>>
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 verwenden
Ich hoffe das hilft!
inspect.getmro
nur Anrufe __mro__
auf dem Objekt, wie Sie sehen können in github.com/python/cpython/blob/... . Die Verwendung getmro
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):
>>> some_object = "some_text"
>>> some_object.__class__.__bases__
(object,)
Für mro in neueren Python-Versionen:
>>> some_object = "some_text"
>>> some_object.__class__.__mro__
(str, object)
Wenn Sie bereits eine Klassendefinition haben, können Sie diese natürlich direkt aufrufen __mro__
:
>>> class A(): pass
>>> A.__mro__
(__main__.A, object)
Wenn Sie sicherstellen möchten, dass alle aufgerufen werden, verwenden Sie sie super
auf allen Ebenen.
type(C()).__bases__
wie unten beschrieben vor