Unterklassen einer Klasse mithilfe der Unterklassen-Methode von Python finden
Das Finden aller Unterklassen einer bestimmten Klasse ist üblich Bedarf in der objektorientierten Programmierung in Python. Python bietet eine elegante Lösung durch die Methode __subclasses__.
Klassen neuen Stils in Python (d. h. solche, die von der Objektklasse erben) verfügen über eine Methode __subclasses__, die eine Liste ihrer Unterklassen zurückgibt. Betrachten Sie die folgende Klassenhierarchie:
class Foo(object): pass class Bar(Foo): pass class Baz(Foo): pass class Bing(Bar): pass
Um die Unterklassen von Foo zu erhalten, rufen Sie einfach Foo.__subclasses__() auf:
print(Foo.__subclasses__()) # Output: [<class '__main__.Bar'>, <class '__main__.Baz'>]
Recursive Subclass Retrieval
Wenn Sie alle Unterklassen, einschließlich Unterunterklassen, finden möchten, ist die Rekursion hilfreich notwendig:
def all_subclasses(cls): return set(cls.__subclasses__()).union( [s for c in cls.__subclasses__() for s in all_subclasses(c)]) print(all_subclasses(Foo)) # Output: {<class '__main__.Bar'>, <class '__main__.Baz'>, <class '__main__.Bing'>}
Umgang mit Klassennamen-Strings
Sie haben erwähnt, dass Unterklassen gefunden werden sollen, denen der Klassenname als String gegeben wird. Da es sich bei Python-Klassen um erstklassige Objekte handelt, wird empfohlen, die Klasse direkt und nicht als Zeichenfolgendarstellung zu verwenden. Wenn Sie jedoch über eine Klassennamenzeichenfolge verfügen, können Sie die Klasse mithilfe des globals()-Wörterbuchs abrufen:
name = 'Foo' cls = globals()[name] print(cls.__subclasses__())
Für Klassen, die in verschiedenen Modulen definiert sind, können Sie importlib verwenden, um die Klasse durch Importieren abzurufen Modul und Zugriff auf das entsprechende Attribut:
name = 'pkg.module.Foo' import importlib modname, _, clsname = name.rpartition('.') mod = importlib.import_module(modname) cls = getattr(mod, clsname) print(cls.__subclasses__())
Das obige ist der detaillierte Inhalt vonWie finde ich Unterklassen einer Python-Klasse mit „__subclasses__'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!