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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top