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

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

Patricia Arquette
Patricia Arquetteoriginal
2024-11-17 09:50:03223parcourir

How Can I Find All Subclasses of a Python Class?

Accès aux sous-classes d'une classe

En Python, trouver toutes les sous-classes d'une classe donnée peut être obtenu grâce à la méthode __subclasses__. Cette méthode est disponible pour les classes de nouveau style (celles héritant d'un objet dans Python 3 ou sous-classées d'une classe de nouveau style).

Par exemple, considérons le code suivant :

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

Pour récupérer les sous-classes de Foo, on peut utiliser le code suivant :

print([cls.__name__ for cls in Foo.__subclasses__()])

Cela affichera les noms des sous-classes :

['Bar', 'Baz']

Nous pouvons également obtenir les sous-classes elles-mêmes en utilisant __subclasses__() :

print(Foo.__subclasses__())

Cela affichera la liste de sous-classes suivante :

[<class '__main__.Bar'>, <class '__main__.Baz'>]

Pour confirmer que ces sous-classes ont bien Foo comme classe de base, nous pouvons utiliser ce qui suit code :

for cls in Foo.__subclasses__():
    print(cls.__base__)

Cela affichera ce qui suit :

<class '__main__.Foo'>
<class '__main__.Foo'>

Cependant, il convient de noter que si la définition de classe d'une sous-classe n'a pas encore été exécutée, elle ne le sera pas trouvé par __subclasses__. Pour tenir compte de cela, 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))

Cela affichera :

{<class '__main__.Bar'>, <class '__main__.Baz'>, <class '__main__.Bing'>}

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