¿Listar todas las clases base en una jerarquía de clase dada?
-
05-07-2019 - |
Pregunta
Dada una clase Foo
(si es un clase de nuevo estilo o no), ¿cómo genera todas las clases base, en cualquier lugar de la jerarquía de herencia, es issubclass
of?
Solución
inspect.getmro (cls)
funciona para las clases de estilo nuevas y antiguas y devuelve lo mismo que NewClass.mro ()
: una lista de la clase y todas sus clases ancestrales, 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'>)
Otros consejos
Consulte la __bases__
propiedad disponible en una clase
de python, que contiene una tupla de las clases básicas:
>>> 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>]
inspect.getclasstree ()
creará una lista anidada de clases y sus bases.
Uso:
inspect.getclasstree(inspect.getmro(IOError)) # Insert your Class instead of IOError.
puede usar la tupla __bases__
del objeto de clase:
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!
Aunque la respuesta de Jochen es muy útil y correcta, ya que puede obtener la jerarquía de clases utilizando el método .getmro () del módulo de inspección, también es importante destacar que la jerarquía de herencia de Python es la siguiente:
ex:
class MyClass(YourClass):
Una clase hereditaria
- Clase infantil
- clase derivada
- Subclase
ex:
class YourClass(Object):
Una clase heredada
- Clase principal
- Clase base
- Superclase
Una clase puede heredar de otra - Las clases atribuidas son heredadas. - En particular, sus métodos son heredados. - esto significa que las instancias de una clase heredada (secundaria) pueden acceder atribuidas a la clase heredada (primaria)
instancia - > clase - > luego clases heredadas
usando
import inspect
inspect.getmro(MyClass)
le mostrará la jerarquía, dentro de Python.
En python 3.7 no necesita importar inspeccionar, type.mro le dará el resultado.
>>> class A:
... pass
...
>>> class B(A):
... pass
...
>>> type.mro(B)
[<class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
>>>
atención que en python 3.x cada clase hereda de la clase de objeto base.