Comment puis-je obtenir la ou les classes parentes d'une classe Python?
202
Utilisez l'attribut suivant:
cls.__bases__
De la documentation :
Le tuple des classes de base d'un objet de classe.
Exemple:
>>> str.__bases__
(<type 'basestring'>,)
Un autre exemple:
>>> class A(object):
... pass
...
>>> class B(object):
... pass
...
>>> class C(A, B):
... pass
...
>>> C.__bases__
(<class '__main__.A'>, <class '__main__.B'>)
type(C()).__bases__
comme indiqué ciSi vous voulez tous les ancêtres plutôt que les immédiats, utilisez inspect.getmro :
Utilement, cela vous donne toutes les classes d'ancêtres dans «l'ordre de résolution des méthodes» - c'est-à-dire l'ordre dans lequel les ancêtres seront vérifiés lors de la résolution d'une méthode (ou, en fait, de tout autre attribut) - les méthodes et autres attributs vivent dans le même espace de noms en Python, après tout ;-).
la source
cls.__mro__
(au moins dans Python 3.5)Les classes de nouveau style ont une méthode mro que vous pouvez appeler qui renvoie une liste des classes parentes dans l'ordre de résolution de la méthode.
la source
object
ne semble pas répondremro
.x
, nous pouvons obtenir l'ordre de résolution de la méthode avec l'appel quetype(x).mro()
nous pouvons considérer six
aClassX
comme classe de base avec:ClassX in type(x).mro()
La manière la plus RAPIDE , pour voir tous les parents, et DANS L'ORDRE , utilisez simplement le
__mro__
c'est à dire
repr(YOUR_CLASS.__mro__)
sorties, DANS L' ORDRE
Voilà. La "meilleure" réponse en ce moment, a 182 votes (comme je tape ceci) mais c'est tellement plus simple que certains alambiqués pour la boucle, examinant les bases d' une classe à la fois, sans mentionner quand une classe étend DEUX ou plusieurs parents Des classes. L'importation et l'utilisation
inspect
ne couvrent que la portée inutilement. Honnêtement, c'est dommage que les gens ne sachent pas simplement utiliser les fonctions intégréesJ'espère que ça aide!
la source
inspect.getmro
suffit d'appeler l'__mro__
objet, comme vous pouvez le voir sur github.com/python/cpython/blob/… . L'utilisationgetmro
produit un code plus propre et plus lisible. Bien que sauter un appel de fonction soit en effet plus rapide.Utilisez des bases si vous voulez simplement obtenir les parents, utilisez
__mro__
(comme indiqué par @ naught101) pour obtenir l'ordre de résolution de la méthode (afin de savoir dans quel ordre les init ont été exécutées).Bases (et d'abord obtenir la classe pour un objet existant):
Pour mro dans les versions récentes de Python:
Évidemment, quand vous avez déjà une définition de classe, vous pouvez simplement l'appeler
__mro__
directement:la source
Si vous voulez vous assurer qu'ils seront tous appelés, utilisez-les
super
à tous les niveaux.la source