Maison >développement back-end >Tutoriel Python >Comment trouver les sous-classes d'une classe Python à l'aide de « __subclasses__ » ?

Comment trouver les sous-classes d'une classe Python à l'aide de « __subclasses__ » ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-22 16:08:13381parcourir

How to Find Subclasses of a Python Class Using `__subclasses__`?

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!

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