¿Cómo conseguir a los padres de una clase de Python?

¿Cómo puedo obtener la (s) clase (s) de los padres de una clase de Python?

Usa el siguiente atributo:

cls.__bases__ 

De los documentos :

La tupla de clases base de un objeto de clase.

Ejemplo:

 >>> str.__bases__ (,) 

Otro ejemplo:

 >>> class A(object): ... pass ... >>> class B(object): ... pass ... >>> class C(A, B): ... pass ... >>> C.__bases__ (, ) 

Si desea todos los antepasados ​​en lugar de los inmediatos, use inspeccionar.getmro :

 import inspect print inspect.getmro(cls) 

De manera útil, esto le da a todas las clases de antecesores en el “orden de resolución de métodos”, es decir, el orden en el que se verificarán los ancestros al resolver un método (o, en realidad, cualquier otro atributo – los métodos y otros atributos viven en el mismo espacio de nombres en Python, después de todo ;-).

Las clases de nuevo estilo tienen un método mro al que puede llamar, el cual devuelve una lista de clases primarias en orden de resolución de métodos.

Si desea asegurarse de que todos sean llamados, use super en todos los niveles.

La forma MÁS RÁPIDA , para ver a todos los padres, y EN ORDEN , simplemente use __mro__

es decir, repr(YOUR_CLASS.__mro__)


 >>> >>> >>> import getpass >>> getpass.GetPassWarning.__mro__ 

salidas, EN ORDEN


 (, , , , , ) >>> 

Ahí tienes. La “mejor” respuesta ahora mismo, tiene 182 votos (mientras escribo esto), pero es mucho más simple que algunos bucles enrevesados, al analizar las bases de una clase a la vez, por no mencionar cuando una clase se extiende DOS o más padres. clases Importar y usar inspect solo nubla el scope innecesariamente. Honestamente, es una lástima que la gente no sepa simplemente usar los elementos integrados

¡Espero que esto ayude!

Utilice las bases si solo desea obtener a los padres, use __mro__ (como lo indica @napey101) para obtener la orden de resolución del método (para saber en qué orden se ejecutaron los iniciadores).

Bases (y primero obtener la clase para un objeto existente):

 >>> some_object = "some_text" >>> some_object.__class__.__bases__ (object,) 

Para mro en versiones recientes de Python:

 >>> some_object = "some_text" >>> some_object.__class__.__mro__ (str, object) 

Obviamente, cuando ya tienes una definición de clase, simplemente puedes llamar a __mro__ directamente:

 >>> class A(): pass >>> A.__mro__ (__main__.A, object)