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

Susan Sarandon
Libérer: 2024-11-22 16:08:13
original
301 Les gens l'ont consulté

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
Copier après la connexion

Pour obtenir les sous-classes de Foo, appelez simplement Foo.__subclasses__() :

print(Foo.__subclasses__())
# Output: [<class '__main__.Bar'>, <class '__main__.Baz'>]
Copier après la connexion

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'>}
Copier après la connexion

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__())
Copier après la connexion

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__())
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal