2009-09-09 6 views

Respuesta

127

inspect.getmro(cls) obras para los nuevos y viejos clases de estilo y devuelve el mismo que NewClass.mro() : una lista de la clase y todas sus clases antecesoras, en el orden utilizado para la resolución del método.

>>> class A(object): 
>>>  pass 
>>> 
>>> class B(A): 
>>>  pass 
>>> 
>>> import inspect 
>>> inspect.getmro(B) 
(<class '__main__.B'>, <class '__main__.A'>, <type 'object'>) 
+1

Bien hecho: –

+1

http://docs.python.org/library/inspect.html#inspect.getmro No funciona para las clases PyObjC :( archivo "/Users/rbp/Projects/zzzzzzz/macmdtypes.py", línea 70, en coaccionar inspect.getmro de impresión (path) de archivos "/System/Library/Frameworks/Python.framework/ Versions/2.7/lib/python2.7/inspect.py ", línea 348, en getmro _bases de búsqueda (cls, resultado) Archivo" /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7 /inspect.py ", línea 339, en _bases de búsqueda para base en cls .__ bases__: AttributeError: el objeto '__NSTaggedDate' no tiene ningún atributo '__bases__' – rbp

+7

@rbp Me susurro Parece que tuviste el mismo problema que encontré: intentabas hacer 'inspeccionar.getmro (obj)' en lugar de 'inspeccionar.getmro (tipo (obj))'. – esmit

13

puede utilizar el __bases__ tupla de la clase de objeto:

class A(object, B, C): 
    def __init__(self): 
     pass 
print A.__bases__ 

La tupla devuelta por __bases__ tiene todas sus clases base.

Espero que ayude!

24

inspect.getclasstree() creará una lista anidada de clases y sus bases. Uso:

inspect.getclasstree(inspect.getmro(IOError)) # Insert your Class instead of IOError. 
+1

Ooh, agradable. ¡Y para un resultado aún mejor, utiliza pprint! 'python -c 'inspeccionar importación; de pprint import pprint como pp; pp (inspeccionar.getclasstree (inspeccionar.getmro (IOError))) '' – penguin359

28

Véase el __bases__ property disponible en una pitón class, que contiene una tupla de las clases bases:

>>> 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>] 
+2

Esto puede presentar duplicados. Y esta es la razón por la cual la documentación para 'getmro' explícitamente dice" ¿Ninguna clase aparece más de una vez en esta tupla "? –

+2

Atención, '__bases__' solo sube ** un nivel **. (A medida que su utilidad recursivo implica, pero un rápido vistazo al ejemplo podría no recoger en eso.) –

1

Aunque la respuesta de Jochen es muy útil y correcta, como se puede obtener la jerarquía de clases utilizando el.Método getmro() del módulo de inspeccionar, también es importante destacar que la jerarquía de herencia de Python es la siguiente:

ejemplo:

class MyClass(YourClass): 

Una heredera de clase

  • de Child-Pugh
  • clase derivada
  • Subclase

ex:

class YourClass(Object): 

hereditario clase

  • clase Parent
  • clase Base
  • Superclass

Una clase puede heredar de otra - La clase atribuido se heredan - en particular, sus métodos se heredan - esto significa que las instancias de una clase que hereda (niño) pueden acceder atribuido de la clase heredada (padre)

ejemplo -> clase -> clases heredadas entonces

usando

import inspect 
inspect.getmro(MyClass) 

le mostrará la jerarquía, dentro de Python.

Cuestiones relacionadas