2010-04-10 10 views
129

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

+31

@FranckDernoncourt Este tema es ahora el resultado principal de Google para "Python get parent class". Es un poco más relevante que las otras preguntas de SO que componen los próximos 3 resultados. El quinto resultado es una página de Python docs que no da la respuesta, y el sexto resultado es finalmente una página de Python que da la respuesta, aunque profundamente en una larga página de texto. –

+22

¿Por qué alguien leería los documentos cuando las explicaciones sobre SO son mucho más convincentes y de fácil acceso? Me tomó menos de 5 segundos desde el momento en que se me ocurrió esta pregunta hasta el momento en que llegué a esta página de Google, mientras que buscar en los documentos me hubiera llevado al menos cinco veces más tiempo y posiblemente un par de minutos. – jononomo

+6

Como alguien que quería encontrar rápidamente esta respuesta, busqué en google, encontré este enlace, y terminé lo que necesitaba hacer: ¿por qué la gente (supongo que el comentario de SLott fue eliminado) se queja de una pregunta válida? Y sí, me doy cuenta de que llegué muy tarde a la fiesta aquí. – limasxgoesto0

Respuesta

149

Utilice el siguiente atributo:

cls.__bases__ 

Desde el docs:

La tupla de clases base de un objeto de clase.

Ejemplo:

>>> str.__bases__ 
(<type 'basestring'>,) 

Otro ejemplo:

>>> class A(object): 
... pass 
... 
>>> class B(object): 
... pass 
... 
>>> class C(A, B): 
... pass 
... 
>>> C.__bases__ 
(<class '__main__.A'>, <class '__main__.B'>) 
74

Si desea que todos los antepasados ​​ en lugar de sólo los inmediatos, utilice inspect.getmro:

import inspect 
print inspect.getmro(cls) 

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

+7

También puede usar 'cls .__ mro__' (al menos en Python 3.5) – naught101

3

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

+0

Una vez que usa super, debe usarlo en todos los niveles, por lo que debe documentar su uso de forma explícita. También es posible que desee saber que super no funciona en todas las clases ... – DasIch

11

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

+0

¿Qué cuenta como una clase de nuevo estilo? Parece que puedo usar esto con los modelos de Django, pero cualquier cosa simplemente heredando de 'objeto' no parece responder a' mro'. –

+0

considerando un objeto 'x', podemos obtener la orden de resolución de métodos con la llamada' tipo (x) .mro() ' podemos considerar si' 'x' tiene ClassX' como una clase base con: 'ClassX en tipo (x) .mro()' – 648trindade

Cuestiones relacionadas