Lister toutes les classes de base dans une hiérarchie de classe donnée?
-
05-07-2019 - |
Question
Étant donné une classe Foo
(que ce soit une new-style classe ou non), comment générez-vous toutes les classes de base - n’importe où dans la hiérarchie de l’héritage - it issubclass
sur?
La solution
inspect.getmro (cls)
fonctionne pour les classes de style nouvelles et anciennes et retourne la même chose que NewClass.mro ()
: liste de la classe et de toutes ses classes ancêtres, dans l'ordre utilisé pour la résolution de la méthode.
>>> class A(object):
>>> pass
>>>
>>> class B(A):
>>> pass
>>>
>>> import inspect
>>> inspect.getmro(B)
(<class '__main__.B'>, <class '__main__.A'>, <type 'object'>)
Autres conseils
Voir la propriété __ bases __
disponible sur une classe
python, qui contient un tuple des classes de base:
>>> def classlookup(cls):
... c = list(cls.__bases__)
... for base in c:
... c.extend(classlookup(base))
... return c
...
>>> class A: pass
...
>>> class B(A): pass
...
>>> class C(object, B): pass
...
>>> classlookup(C)
[<type 'object'>, <class __main__.B at 0x00AB7300>, <class __main__.A at 0x00A6D630>]
inspect.getclasstree ()
créera une liste imbriquée de classes et de leurs bases.
Utilisation:
inspect.getclasstree(inspect.getmro(IOError)) # Insert your Class instead of IOError.
vous pouvez utiliser le tuple __ bases __
de l'objet de classe:
class A(object, B, C):
def __init__(self):
pass
print A.__bases__
Le tuple renvoyé par __ bases __
a toutes ses classes de base.
J'espère que ça aide!
Bien que la réponse de Jochen soit très utile et correcte, car vous pouvez obtenir la hiérarchie de classes à l'aide de la méthode .getmro () du module inspecter, il est également important de souligner que la hiérarchie d'héritage de Python est la suivante:
ex:
class MyClass(YourClass):
Une classe héritante
- Classe enfant
- Classe dérivée
- sous-classe
ex:
class YourClass(Object):
Une classe héritée
- Classe parente
- classe de base
- superclasse
Une classe peut hériter d'une autre - Les classes attribuées sont héritées - en particulier, ses méthodes sont héritées - Cela signifie que les instances d’une classe héréditaire (enfant) peuvent accéder aux attributs attribués à la classe héritée (parent)
instance - > classe - > puis classes héritées
utilisant
import inspect
inspect.getmro(MyClass)
vous montrera la hiérarchie au sein de Python.
Dans Python 3.7, vous n'avez pas besoin d'importer inspecter, tapez.mro vous donnera le résultat.
>>> class A:
... pass
...
>>> class B(A):
... pass
...
>>> type.mro(B)
[<class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
>>>
Attention, dans Python 3.x, chaque classe hérite de la classe d'objets de base.