web-dev-qa-db-fra.com

Comment obtenir les parents d'une classe Python?

Comment obtenir la ou les classes parentes d'une classe Python? 

160
John Smith

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'>)
185
Ayman Hourieh

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 ;-).

88
Alex Martelli

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.

13
DasIch

Si vous voulez vous assurer qu'ils sont tous appelés, utilisez super à tous les niveaux.

3
Mike Graham

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)
1
PascalVKooten

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!

0
PyTis