Comment les parents d'un Python de classe?
Comment puis-je obtenir de la classe parent(s) d'un Python de classe?
Vous devez vous connecter pour publier un commentaire.
Comment puis-je obtenir de la classe parent(s) d'un Python de classe?
Vous devez vous connecter pour publier un commentaire.
Utiliser l'attribut suivant:
De la docs:
Exemple:
Un autre exemple:
Si vous voulez toutes les ancêtres plutôt que de simplement immédiats, l'utilisation inspecter.getmro:
Utilement, cela vous donne tous ancêtre des classes dans la "méthode de résolution de commande" -- 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, n'importe quel autre attribut -- méthodes et d'autres attributs de vivre dans le même espace de noms en Python, après tout;-).
cls.__mro__
(au moins en Python 3.5)Nouveau style de classes ont un mro méthode, vous pouvez appeler qui renvoie une liste de classes parent dans la méthode de résolution de l'ordre.
object
ne semble pas répondre àmro
.x
, nous pouvons obtenir la méthode de résolution de l'ordre avec l'appeltype(x).mro()
nous pouvons considérer six
aClassX
comme une classe de base avec:ClassX in type(x).mro()
La plus RAPIDE ailleurs, tous les parents, et AFIN, il suffit d'utiliser le construit en
__mro__
c'est à dire
repr(YOUR_CLASS.__mro__)
sorties, DANS ORDRE
Là vous l'avez. La "meilleure" réponse de droite maintenant, a 182 votes (je suis en tapant cela), mais c'est TELLEMENT plus simple que certains alambiqué pour la boucle, en regardant dans bases une seule classe à la fois, de ne pas mentionner le fait que quand une classe étend sur DEUX ou plusieurs classes parentes. L'importation et l'utilisation
inspect
juste des nuages de la portée inutilement. Honnêtement est une honte que les gens ne savent pas simplement utiliser la fonction built-insJ'Espère que cela Aide!
inspect.getmro
appelle juste__mro__
sur l'objet, comme vous pouvez le voir dans github.com/python/cpython/blob/... . À l'aide degetmro
produit nettoyant et un code plus lisible. Bien que le fait de sauter un appel de fonction est en effet plus rapide.Si vous voulez vous assurer qu'ils ont tous appelé, utilisez
super
à tous les niveaux.Utilisation des bases si vous voulez juste pour obtenir les parents, utiliser
__mro__
(comme l'a fait remarquer @naught101) pour l'obtention de la méthode de résolution de l'ordre (à savoir l'ordre dans lequel l'init du ont été exécutés).Bases (et d'abord obtenir la classe d'un objet existant):
Pour les mre dans les dernières versions de Python:
Évidemment, quand vous avez déjà une définition de classe, vous pouvez les appeler
__mro__
sur directement: