Wie können Sie bei einer gegebenen Klasse Foo
(unabhängig davon, ob es sich um eine Klasse neuen Stils handelt oder nicht) alle Basisklassen - irgendwo in der Vererbungshierarchie - daraus generieren issubclass
?
Wie können Sie bei einer gegebenen Klasse Foo
(unabhängig davon, ob es sich um eine Klasse neuen Stils handelt oder nicht) alle Basisklassen - irgendwo in der Vererbungshierarchie - daraus generieren issubclass
?
Antworten:
inspect.getmro(cls)
Funktioniert sowohl für Klassen im neuen als auch im alten Stil und gibt dasselbe zurück wie NewClass.mro()
: eine Liste der Klasse und aller ihrer Vorfahrenklassen in der Reihenfolge, in der die Methodenauflösung verwendet wird.
>>> class A(object):
>>> pass
>>>
>>> class B(A):
>>> pass
>>>
>>> import inspect
>>> inspect.getmro(B)
(<class '__main__.B'>, <class '__main__.A'>, <type 'object'>)
inspect.getmro(obj)
anstatt inspect.getmro(type(obj))
.
Sehen Sie sich die __bases__
Eigenschaft an class
, die für eine Python verfügbar ist , die ein Tupel der Basisklassen enthält:
>>> def classlookup(cls):
... c = list(cls.__bases__)
... for base in c:
... c.extend(classlookup(base))
... return c
...
>>> class A: pass
...
>>> class B(A): pass
...
>>> class C(object, B): pass
...
>>> classlookup(C)
[<type 'object'>, <class __main__.B at 0x00AB7300>, <class __main__.A at 0x00A6D630>]
getmro
explizit "Keine Klasse erscheint mehr als einmal in diesem Tupel"?
__bases__
geht nur eine Ebene höher . (Wie Ihr rekursives Dienstprogramm andeutet, aber ein flüchtiger Blick auf das Beispiel könnte dies nicht aufgreifen.)
inspect.getclasstree()
erstellt eine verschachtelte Liste der Klassen und ihrer Basen. Verwendung:
inspect.getclasstree(inspect.getmro(IOError)) # Insert your Class instead of IOError.
python -c 'import inspect; from pprint import pprint as pp; pp(inspect.getclasstree(inspect.getmro(IOError)))'
Sie können das __bases__
Tupel des Klassenobjekts verwenden:
class A(object, B, C):
def __init__(self):
pass
print A.__bases__
Das von zurückgegebene Tupel __bases__
hat alle seine Basisklassen.
Ich hoffe es hilft!
__bases__
In Python 3.7 müssen Sie inspect nicht importieren. Type.mro gibt Ihnen das Ergebnis.
>>> class A:
... pass
...
>>> class B(A):
... pass
...
>>> type.mro(B)
[<class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
>>>
Beachten Sie, dass in Python 3.x jede Klasse von der Basisobjektklasse erbt.
Laut Python-Dokument können wir auch einfach class.__mro__
Attribute oder class.mro()
Methoden verwenden:
>>> class A:
... pass
...
>>> class B(A):
... pass
...
>>> B.__mro__
(<class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
>>> A.__mro__
(<class '__main__.A'>, <class 'object'>)
>>> object.__mro__
(<class 'object'>,)
>>>
>>> B.mro()
[<class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
>>> A.mro()
[<class '__main__.A'>, <class 'object'>]
>>> object.mro()
[<class 'object'>]
>>> A in B.mro()
True
Obwohl Jochens Antwort sehr hilfreich und richtig ist, da Sie die Klassenhierarchie mit der .getmro () -Methode des Inspect-Moduls erhalten können, ist es auch wichtig hervorzuheben, dass die Vererbungshierarchie von Python wie folgt lautet:
Ex:
class MyClass(YourClass):
Eine erbende Klasse
Ex:
class YourClass(Object):
Eine geerbte Klasse
Eine Klasse kann von einer anderen erben - Die zugewiesenen Klassen werden geerbt - insbesondere werden ihre Methoden vererbt - dies bedeutet, dass Instanzen einer ererbenden (untergeordneten) Klasse auf die der geerbten (übergeordneten) Klasse zugeschriebenen zugreifen können
Instanz -> Klasse -> dann geerbte Klassen
mit
import inspect
inspect.getmro(MyClass)
zeigt Ihnen die Hierarchie in Python.