É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?
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'>)
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>]
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.
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!
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
ex:
class YourClass(Object):
ne classe héritée
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.
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.
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