Maison >développement back-end >Tutoriel Python >Comment puis-je trouver toutes les sous-classes d'une classe en Python ?

Comment puis-je trouver toutes les sous-classes d'une classe en Python ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-15 06:05:02554parcourir

How Can I Find All Subclasses of a Class in 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 :

  1. Trouvez la classe en utilisant le nom de la classe.
  2. Utilisez __subclasses__() pour récupérer le sous-classes de la classe localisée.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn