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

Comment trouver les sous-classes d'une classe donnée en Python ?

DDD
DDDoriginal
2024-11-16 01:39:03960parcourir

How can I find the subclasses of a given class in Python?

Recherche des sous-classes d'une classe en Python

En Python, vous pouvez déterminer les sous-classes d'une classe donnée grâce à ses __subclasses__( ) méthode. Cette méthode est disponible pour les classes de nouveau style, héritées de la classe "object" et couramment utilisées dans Python 3.

Pour obtenir les noms des sous-classes :

class Foo(object): pass
class Bar(Foo): pass
class Baz(Foo): pass
class Bing(Bar): pass

[cls.__name__ for cls in Foo.__subclasses__()]
# ['Bar', 'Baz']

Alternativement, pour récupérer les sous-classes elles-mêmes :

Foo.__subclasses__()
# [<class '__main__.Bar'>, <class '__main__.Baz'>]

Pour confirmer l'association de classe de base :

for cls in Foo.__subclasses__():
    print(cls.__base__)
# <class '__main__.Foo'>
# <class '__main__.Foo'>

Récupération récursive de sous-classe :

Si vous devez capturer des sous-sous-classes (petits-enfants, etc.), une approche récursive est nécessaire :

def all_subclasses(cls):
    return set(cls.__subclasses__()).union(
        [s for c in cls.__subclasses__() for s in all_subclasses(c)])

all_subclasses(Foo)
# {<class '__main__.Bar'>, <class '__main__.Baz'>, <class '__main__.Bing'>}

Remarque : Si la définition de classe d'une sous-classe n'a pas été exécutée (par exemple, son module est non importé), il ne sera pas détectable par __subclasses__().

Obtention de sous-classes à partir d'un nom de classe :

Supposons que vous ayez le nom de classe sous forme de chaîne à la place. Dans ce cas, suivez ces étapes :

  1. Recherchez l'objet de classe en utilisant le nom de la classe :

    • Si dans le même module :

      cls = globals()[name]
    • Si dans n'importe quel module :

      import importlib
      modname, _, clsname = name.rpartition('.')
      mod = importlib.import_module(modname)
      cls = getattr(mod, clsname)
  2. Utilisez __subclasses__() pour obtenir les sous-classes de l'objet de classe récupéré.

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