Maison >développement back-end >Tutoriel Python >Comment puis-je trouver toutes les sous-classes d'une classe en Python ?
Recherche de toutes les sous-classes d'une classe en Python
Pour récupérer toutes les classes héritées d'une classe de base spécifiée en Python, utilisez la méthode __subclasses__() méthode. Cette méthode est disponible pour les classes de nouveau style qui étendent la classe d'objet (valeur par défaut dans Python 3). Voici comment cela fonctionne :
class Foo(object): pass class Bar(Foo): pass class Baz(Foo): pass class Bing(Bar): pass print([cls.__name__ for cls in Foo.__subclasses__()]) # ['Bar', 'Baz'] print(Foo.__subclasses__()) # [<class '__main__.Bar'>, <class '__main__.Baz'>]
Pour inclure des sous-sous-classes, la récursivité peut être utilisée :
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)) # {<class '__main__.Bar'>, <class '__main__.Baz'>, <class '__main__.Bing'>}
Remarque : Sous-classes qui n'ont pas encore été définies (par exemple, en raison de modules non importés) ne sera pas détecté par __subclasses__().
Localisation des sous-classes à l'aide d'une chaîne de nom de classe :
Lorsque seul le nom de la classe est disponible sous forme de chaîne, les étapes suivantes sont nécessaires :
Recherche d'une classe à partir d'une chaîne de nom :
La méthode de localisation d'une classe à partir d'une chaîne de nom dépend de son emplacement attendu :
Si prévu dans le même module :
cls = globals()[name]
Si prévu dans l'espace de noms local :
cls = locals()[name]
Si n'importe où dans les modules :
import importlib modname, _, clsname = name.rpartition('.') mod = importlib.import_module(modname) cls = getattr(mod, clsname)
Une fois la classe trouvée, sa méthode __subclasses__() peut être utilisée pour récupérer la classe souhaitée. liste des sous-classes.
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!