Recherche des sous-classes d'une classe à l'aide de la méthode sous-classes de Python
Trouver toutes les sous-classes d'une classe donnée est une tâche courante besoin en programmation orientée objet Python. Python fournit une solution élégante grâce à la méthode __subclasses__.
Les classes de nouveau style en Python (c'est-à-dire celles qui héritent de la classe d'objet) ont une méthode __subclasses__ qui renvoie une liste de leurs sous-classes. Considérez la hiérarchie de classes suivante :
class Foo(object): pass class Bar(Foo): pass class Baz(Foo): pass class Bing(Bar): pass
Pour obtenir les sous-classes de Foo, appelez simplement Foo.__subclasses__() :
print(Foo.__subclasses__()) # Output: [<class '__main__.Bar'>, <class '__main__.Baz'>]
Récupération récursive de sous-classes
Si vous souhaitez rechercher toutes les sous-classes, y compris les sous-sous-classes, la récursivité est nécessaire :
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'>}
Traitement des chaînes de nom de classe
Vous avez mentionné la recherche de sous-classes en fonction du nom de classe sous forme de chaîne. Étant donné que les classes Python sont des objets de première classe, il est recommandé d'utiliser la classe directement plutôt qu'une représentation sous forme de chaîne. Cependant, si vous disposez d'une chaîne de nom de classe, vous pouvez récupérer la classe à l'aide du dictionnaire globals() :
name = 'Foo' cls = globals()[name] print(cls.__subclasses__())
Pour les classes définies dans différents modules, vous pouvez utiliser importlib pour récupérer la classe en important son module et accéder à l'attribut correspondant :
name = 'pkg.module.Foo' import importlib modname, _, clsname = name.rpartition('.') mod = importlib.import_module(modname) cls = getattr(mod, clsname) print(cls.__subclasses__())
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!