Étant donné une classe Foo
(que ce soit une classe new-style ou non), comment générer toutes les classes de toutes les classes de base - n'importe où dans la hiérarchie d'héritage - issubclass
?Liste toutes les classes de base dans une hiérarchie de classe donnée?
Répondre
inspect.getmro(cls)
œuvres pour les deux classes de style anciens et nouveaux et retourne le même 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'>)
Bravo: http://docs.python.org/library/inspect.html#inspect.getmro –
Ne fonctionne pas pour les classes PyObjC :( fichier "/Users/rbp/Projects/zzzzzzz/macmdtypes.py", ligne 70, en coerce impression inspect.getmro (chemin) fichier « /System/Library/Frameworks/Python.framework/ Versions/2.7/lib/python2.7/inspect.py ", ligne 348, dans getmro _searchbases (cls, résultat) Fichier" /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7 /inspect.py ", ligne 339, dans _searchbases pour la base dans les bases .__Clés__: AttributeError: l'objet '__NSTaggedDate' n'a pas d'attribut '__bases__' – rbp
@rbp pect que vous avez eu le même problème que j'ai rencontré: vous essayiez de faire 'inspect.getmro (obj)' au lieu de 'inspect.getmro (type (obj))'. – esmit
vous pouvez utiliser le __bases__
tuple de l'objet de classe:
class A(object, B, C):
def __init__(self):
pass
print A.__bases__
tuple retourné par __bases__
a toutes ses classes de base.
J'espère que ça aide!
inspect.getclasstree()
va créer une liste imbriquée de classes et leurs bases. Utilisation:
inspect.getclasstree(inspect.getmro(IOError)) # Insert your Class instead of IOError.
Oh, bien. Et pour une sortie encore plus agréable, utilisez pprint! "python -c" import inspect; de pprint import pprint en pp; pp (inspect.getclasstree (inspect.getmro (IOError))) ' – penguin359
Voir la __bases__
property disponible sur un python class
, qui contient un tuple des bases des classes:
>>> 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>]
Ceci peut introduire des doublons. Et c'est pourquoi la documentation de 'getmro' dit explicitement" Aucune classe n'apparaît plus d'une fois dans ce tuple "? –
Attention, '__bases__' monte seulement ** d'un niveau **. (Comme le suggère votre utilité récursive, mais un rapide coup d'œil sur l'exemple pourrait ne pas prendre en compte cela.) –
Bien que la réponse de Jochen est très utile et correct, comme vous pouvez obtenir la hiérarchie des classes en utilisant la.méthode getmro() du module inspecter, il est également important de souligner que la hiérarchie de l'héritage de Python est la suivante:
ex:
class MyClass(YourClass):
Une classe héritant
- classe enfant
- Classe dérivée
- Sous-classe
ex:
class YourClass(Object):
Une classe héritée
- Parent classe
- classe de base
- Superclass
Une classe peut hériter d'une autre - La classe attribuée sont héritées - en particulier, ses méthodes sont héritées - cela signifie que les instances d'un héritant (enfant) classe peuvent accéder attribuée de la classe héritée (parent)
instance -> classe -> classes, puis héritées
utilisant
import inspect
inspect.getmro(MyClass)
vous montrer la hiérarchie, au sein de Python.
- 1. Comment trouver toutes les classes qui implémentent une interface donnée?
- 2. Comment obtenez-vous toutes les propriétés d'une classe et de ses classes de base (dans la hiérarchie) avec Reflection? (C#)
- 3. Comment agréger tous les attributs d'une hiérarchie de classes?
- 4. Comment puis-je travailler sur la hiérarchie des classes donnée une instance d'objet en Python?
- 5. Liste toutes les sous-classes avec des noms entièrement qualifiés
- 6. Liste toutes les classes qui existent actuellement
- 7. Évitant Héritant Toutes les choses de la classe de base
- 8. Comment énumérer toutes les classes avec l'attribut de classe personnalisée?
- 9. Utilisation de toutes les surcharges de la classe de base
- 10. Existe-t-il un moyen d'obtenir une liste de toutes les classes dans une application iPhone?
- 11. La super classe de toutes les classes d'événements
- 12. Implémenter une hiérarchie de classe parent-enfant
- 13. Création de classes de base de base
- 14. Événements dans les classes de base
- 15. groupement/sous-requête LINQ pour remplir une donnée hiérarchie strcuture
- 16. nhibernate table pr hiérarchie récupérant une classe spécifique avec LINQ
- 17. Classes de hiérarchie CSS et ID
- 18. Conversion d'une énumération en une hiérarchie de classes
- 19. Obtention d'une liste de toutes les classes utilisées lors de l'exécution d'une application Java?
- 20. Classe de base IDisposable qui possède une ressource jetable gérée, que faire dans les sous-classes?
- 21. Comment implémenter le clonage profond générique de type sécurisé dans une hiérarchie de classes Java?
- 22. Hiérarchie vs Fusionné Liste
- 23. Production d'une liste de toutes les classes dans un projet C++
- 24. (SWIG/Lua) Comment accéder à la liste des classes de base/parent dans swig_lua_class
- 25. importer toutes les variables de classe parente
- 26. PHP afficher les noms de toutes les classes déclarées?
- 27. Extraction de toutes les classes d'un espace de noms spécifique
- 28. Liste de sous-classes
- 29. Conseils avec Hiérarchie des classes des articles de jeu
- 30. Liste de toutes les vidéos de l'url
Étant donné un objet de classe ('type' serait le meilleur terme)' isinstance' ne fonctionnera pas ... soit vous voulez dire 'issubclass' ou vous voulez prendre une instance ;-p –
Merci; J'ai édité le post. –