Comment obtenir la ou les classes parentes d'une classe Python?
Utilisez l'attribut suivant:
cls.__bases__
De la docs :
Le tuple des classes de base d'une classe objet.
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'>)
Si vous voulez tous les ancêtres plutôt que les immédiats, utilisez inspect.getmro :
import inspect
print inspect.getmro(cls)
Utilement, cela vous donne toutes les classes d'ancêtres dans "l'ordre de résolution de méthode", 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 réalité, de tout autre attribut. en python, après tout ;-).
Les nouvelles classes de style ont une méthode que vous pouvez appeler et qui retourne une liste des classes par ordre de résolution de méthode.
Si vous voulez vous assurer qu'ils sont tous appelés, utilisez super
à tous les niveaux.
Utilisez des bases si vous voulez juste obtenir les parents, utilisez __mro__
(comme indiqué par @ naught101) pour obtenir l'ordre de résolution de la méthode (pour savoir dans quel ordre les init ont été exécutés).
Bases (et obtenir d'abord la classe pour un objet existant):
>>> some_object = "some_text"
>>> some_object.__class__.__bases__
(object,)
Pour mro dans les versions récentes de Python:
>>> some_object = "some_text"
>>> some_object.__class__.__mro__
(str, object)
Évidemment, lorsque vous avez déjà une définition de classe, vous pouvez simplement appeler __mro__
directement sur celle-ci:
>>> class A(): pass
>>> A.__mro__
(__main__.A, object)
Le moyenLE PLUS RAPIDE, pour voir tous les parents, et IN ORDER , utilisez simplement le__mro__
i.e.repr(YOUR_CLASS.__mro__)
>>>
>>>
>>> import getpass
>>> getpass.GetPassWarning.__mro__
sorties, IN ORDER
(<class 'getpass.GetPassWarning'>, <type 'exceptions.UserWarning'>,
<type 'exceptions.Warning'>, <type 'exceptions.Exception'>,
<type 'exceptions.BaseException'>, <type 'object'>)
>>>
Voilà. La "meilleure" réponse à l’heure actuelle a 182 votes (comme je le tape ici), mais c’est SO bien plus simple que certaines boucles compliquées, examinant les bases une classe à la fois, sans oublier quand une classe étend DEUX classes ou plus. Importer et utiliser inspect
obscurcit inutilement la portée. C’est vraiment dommage que les gens ne sachent pas utiliser uniquement les fonctions intégrées
J'espère que ça aide!