2016-06-06 13 views
1

Für jede Klasse können Sie die (nicht-virtuellen) Oberklassen über das Attribut __mro__ und die (nicht virtuellen) Unterklassen durch Aufruf von __subclasses__ anweisen.Python: Howto die virtuellen Superklassen einer Klasse auflisten?

Für jedes ABC können Sie alle virtuellen Unterklassen über das Attribut _abc_registry informieren.

Gibt es eine Möglichkeit, alle virtuellen Oberklassen einer Klasse zu benennen, d. H. Alle Klassen, für die sie als virtuelle Unterklasse registriert ist?

+0

Nein, ich denke nicht, dass es eine andere Möglichkeit gibt, als alle Klassen, die jemals definiert wurden, aufzuzählen und zu überprüfen, ob es sich um virtuelle Unterklassen handelt. – ppperry

+0

Mit "virtuelle Superklasse" meinen Sie abstrakte Basisklasse ...? Wenn ja, bearbeiten Sie vielleicht, so verwenden Sie konsistente Nomenklatur. –

+0

Nein, ich meine nicht ABC im Allgemeinen, sondern nur diejenigen, für die die betreffende Klasse als virtuelle Unterklasse registriert ist (und die daher nicht in "__mro__" aufgeführt sind. –

Antwort

1

For any ABC you can tell all virtual subclasses via the attribute '_abc_registry'.

Nein, Sie können nicht. Sie können auf diese Weise nur explizit registrierte virtuelle Unterklassen finden. Alles, was von __subclasshook__ bearbeitet wird, wird nicht angezeigt.

Um das zu tun, was Sie tun möchten, müssen Sie jedes in Ihrer Python-Sitzung definierte ABC durchlaufen und isinstance aufrufen. Während dies in CPython technisch möglich ist, indem die Typhierarchie mit der __subclasses__ Methode durchlaufen wird, ist es wahrscheinlich eine schlechte Idee.

+0

Sie haben recht, nur explizit registrierte Klassen werden in 'aufgezeichnet _abc_registry' Aber für meinen Zweck ist diese Einschränkung akzeptabel Ich hätte das erwähnen müssen –

+1

@MichaelAmrhein: Sie müssten immer noch jedes ABC durchlaufen, um die Überprüfung durchzuführen, auch wenn Sie versuchen, eine Klasse explizit zu registrieren, die bereits vorhanden ist aus anderen Gründen eine Unterklasse des ABC betrachtet, wird es nicht in der Registrierung enden, so dass Sie nicht einmal sagen können, welche Klassen explizit registriert wurden .. – user2357112

1

Ich denke, Sie fragen, ob es eine Möglichkeit gibt, alle Klassen zu finden, die als Unterklasse eines bestimmten ABC betrachtet werden würden. Anders als durch die globalen und lokalen Namespaces zu iterieren und sie alle zu testen, ist die Antwort nein, es gibt keine Möglichkeit, dies zu tun.

Aufgrund ihrer Natur "wissen" ABCs nicht über ihre Kindklassen (jede Klasse könnte eine Unterklasse eines ABC sein, abhängig davon, was von der __subclasshook__ Methode zurückgegeben wird, d.h. wenn die Unterklasse die richtige Schnittstelle implementiert). Wenn Sie das wollen, würde ich es als ein Symptom für schlechtes Design ansehen. Es könnte sich lohnen, darüber nachzudenken, warum Sie genau das tun wollen.

+0

Ich schreibe eine Art Registrierung für Adapter (Anpassung eines Objekts Bereitstellung eine Schnittstelle a zu einer Schnittstelle b) Um einen Adapter zu finden, der ein gegebenes Objekt an eine gegebene Schnittstelle anpassen kann, muss ich die Schnittstellen kennen, die das Objekt bereitstellt, während das für den AB einfach ist Cs, von der die Objektklasse erbt, suche ich nach einer Möglichkeit, auch die ABCs zu finden, für die die Objektklasse als virtuelle Unterklasse registriert ist. –

+0

Ich stimme zu, dass das Iterieren über die gesamte Klassenhierarchie und das Testen jeder Klasse keine gute Idee ist. Aber für meinen Zweck wäre es akzeptabel, nur ABCs zu finden, für die die Objektklasse explizit als virtuelle Unterklasse registriert wurde (diejenigen ignorierend, die die Objektklasse als Unterklasse über '__subclasshook__' betrachten würden). Also, die einzige Idee, die ich im Moment entwickeln kann, ist eine benutzerdefinierte Metaklasse zu schreiben, die von ABCMeta abgeleitet ist und das ABC innerhalb der registrierten Unterklasse aufzeichnet. –

+0

@MichaelAmrhein Wenn diese Lösung funktionieren würde, könnten Sie auch einfach von der ABC-Hilfsklasse ableiten und die 'register'-Methode überschreiben, damit sie die Registrierung irgendwo aufzeichnet? Ich versuche MCs so gut wie möglich zu vermeiden. –

Verwandte Themen