¿Cómo puedo obtener la (s) clase (s) padre (s) de una clase de Python?
202
Use el siguiente atributo:
cls.__bases__
De los documentos :
La tupla de las 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'>)
type(C()).__bases__
que se menciona más abajoSi desea todos los antepasados en lugar de solo los inmediatos, use inspect.getmro :
De manera útil, esto le proporciona todas las clases de ancestros 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 ;-).
fuente
cls.__mro__
(al menos en Python 3.5)Las clases de estilo nuevo tienen un método mro al que puede llamar que devuelve una lista de clases primarias en orden de resolución de método.
fuente
object
no parece respondermro
.x
, podemos obtener el orden de resolución del método con la llamadatype(x).mro()
que podemos considerar six
tieneClassX
como clase base con:ClassX in type(x).mro()
La forma MÁS RÁPIDA , para ver a todos los padres, Y EN ORDEN , solo use el incorporado
__mro__
es decir
repr(YOUR_CLASS.__mro__)
salidas, EN ORDEN
Ahí tienes. La "mejor" respuesta en este momento, tiene 182 votos (mientras estoy escribiendo esto) pero esto es MUCHO más simple que algunos complicados para bucle, buscando bases una clase a la vez, sin mencionar cuando una clase extiende DOS o más padres clases Importar y usar
inspect
solo nubla el alcance innecesariamente. Sinceramente, es una lástima que la gente no sepa usar solo los elementos integrados¡Espero que esto ayude!
fuente
inspect.getmro
solo invoca__mro__
objetos, como puede ver en github.com/python/cpython/blob/… . El usogetmro
produce un código más limpio y más legible. Aunque omitir una llamada de función es más rápido.Use bases si solo desea obtener los padres, use
__mro__
(como lo señaló @ naught101) para obtener el orden de resolución del método (para saber en qué orden se ejecutaron los init).Bases (y primero obteniendo la clase para un objeto existente):
Para mro en versiones recientes de Python:
Obviamente, cuando ya tiene una definición de clase, puede invocarla
__mro__
directamente:fuente
Si desea asegurarse de que se les llame
super
a todos , úselos en todos los niveles.fuente