Étant donné une classe Foo
(que ce soit une classe de style nouveau ou non), comment générer toutes les classes de base - n'importe où dans la hiérarchie d'héritage - issubclass
de?
Étant donné une classe Foo
(que ce soit une classe de style nouveau ou non), comment générer toutes les classes de base - n'importe où dans la hiérarchie d'héritage - issubclass
de?
Réponses:
inspect.getmro(cls)
fonctionne pour les classes de style nouvelles et anciennes et renvoie 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'>)
inspect.getmro(obj)
au lieu de inspect.getmro(type(obj))
.
Voir la __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>]
getmro
dit explicitement "Aucune classe n'apparaît plus d'une fois dans ce tuple"?
__bases__
ne monte que d' un niveau . (Comme votre utilitaire récursif l'indique, mais un coup d'œil rapide sur l'exemple pourrait ne pas comprendre cela.)
inspect.getclasstree()
créera une liste imbriquée de classes et de leurs bases. Usage:
inspect.getclasstree(inspect.getmro(IOError)) # Insert your Class instead of IOError.
python -c 'import inspect; from pprint import pprint as pp; pp(inspect.getclasstree(inspect.getmro(IOError)))'
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!
__bases__
En python 3.7, vous n'avez pas besoin d'importer inspect, type.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, en python 3.x, chaque classe hérite de la classe d'objet de base.
Selon la documentation Python , nous pouvons également simplement utiliser un class.__mro__
attribut ou une class.mro()
méthode:
>>> 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
Bien que la réponse de Jochen soit très utile et correcte, comme vous pouvez obtenir la hiérarchie des classes en utilisant 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):
Une classe héritière
ex:
class YourClass(Object):
Une classe héritée
Une classe peut hériter d'une autre - La classe 'attribuée est héritée - en particulier, ses méthodes sont héritées - cela signifie que les instances d'une classe (enfant) héritière peuvent accéder à l'attribut de la classe (parent) héritée
instance -> classe -> classes héritées
en utilisant
import inspect
inspect.getmro(MyClass)
vous montrera la hiérarchie, dans Python.