web-dev-qa-db-fra.com

Lister toutes les classes de base dans une hiérarchie de classe donnée?

Étant donné une classe Foo (qu’il s’agisse d’une classe nouveau style ou non), comment générer all les classes de base - n'importe où dans la hiérarchie d'héritage - il issubclass de?

120
Sridhar Ratnakumar

inspect.getmro(cls) fonctionne pour les classes de style nouvelles et anciennes et retourne la même chose que NewClass.mro(): une 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'>)
174
Jochen Ritzel

Voir le __bases__ propriété disponible sur un python class, 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>]
38
Crescent Fresh

inspect.getclasstree() créera une liste imbriquée de classes et leurs bases. Usage:

inspect.getclasstree(inspect.getmro(IOError)) # Insert your Class instead of IOError.
30
Ned Batchelder

vous pouvez utiliser le __bases__ Tuple de l'objet de classe:

class A(object, B, C):
    def __init__(self):
       pass
print A.__bases__

Le tuple retourné par __bases__ a toutes ses classes de base.

J'espère que ça aide!

21
mandel

Bien que la réponse de Jochen soit très utile et correcte, comme vous pouvez obtenir la hiérarchie de classes à l'aide de la méthode .getmro () du module inspect, il est également important de souligner que la hiérarchie d'héritage de Python est la suivante:

ex:

class MyClass(YourClass):

ne classe héritante

  • Classe enfant
  • Classe dérivée
  • Sous-classe

ex:

class YourClass(Object):

ne classe héritée

  • Classe parent
  • Classe de base
  • Superclasse

Une classe peut hériter d'une autre. Les attributions de la classe sont héritées. En particulier, ses méthodes sont héritées. Cela signifie que les instances d'une classe héritée (enfant) peuvent accéder à l'attribut de la classe héritée (parent).

instance -> classe -> puis classes héritées

en utilisant

import inspect
inspect.getmro(MyClass)

va vous montrer la hiérarchie, au sein de Python.

2
Carson

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 que dans python 3.x chaque classe hérite de la classe d'objet de base.

0
Serjik

Selon le doc Python , nous pouvons aussi simplement utiliser l'attribut class.__mro__ Ou la méthode class.mro():

>>> class A:
...     pass
... 
>>> class B(A):
...     pass
... 
>>> B.__mro__
(<class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
>>> A.__mro__
(<class '__main__.A'>, <class 'object'>)
>>> object.__mro__
(<class 'object'>,)
>>>
>>> B.mro()
[<class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
>>> A.mro()
[<class '__main__.A'>, <class 'object'>]
>>> object.mro()
[<class 'object'>]
>>> A in B.mro()
True

0
YaOzI