Dada una clase Foo
(ya sea una clase de estilo nuevo o no), ¿cómo se generan todas las clases base, en cualquier lugar de la jerarquía de herencia issubclass
?
Dada una clase Foo
(ya sea una clase de estilo nuevo o no), ¿cómo se generan todas las clases base, en cualquier lugar de la jerarquía de herencia issubclass
?
Respuestas:
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'>)
inspect.getmro(obj)
lugar de hacerlo inspect.getmro(type(obj))
.
Vea la __bases__
propiedad disponible en una python class
, que contiene una tupla de las clases base:
>>> 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>]
getmro
explícitamente dice "Ninguna clase aparece más de una vez en esta tupla"?
__bases__
solo sube un nivel . (Como su utilidad recursiva implica, pero una mirada superficial al ejemplo podría no captar eso.)
inspect.getclasstree()
creará una lista anidada de clases y sus bases. Uso:
inspect.getclasstree(inspect.getmro(IOError)) # Insert your Class instead of IOError.
python -c 'import inspect; from pprint import pprint as pp; pp(inspect.getclasstree(inspect.getmro(IOError)))'
puedes usar la __bases__
tupla 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 eso ayude!
__bases__
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.
Según el documento de Python , también podemos simplemente usar el class.__mro__
atributo o el class.mro()
método:
>>> class A:
... pass
...
>>> class B(A):
... pass
...
>>> B.__mro__
(<class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
>>> A.__mro__
(<class '__main__.A'>, <class 'object'>)
>>> object.__mro__
(<class 'object'>,)
>>>
>>> B.mro()
[<class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
>>> A.mro()
[<class '__main__.A'>, <class 'object'>]
>>> object.mro()
[<class 'object'>]
>>> A in B.mro()
True
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 resaltar que la jerarquía de herencia de Python es la siguiente:
ex:
class MyClass(YourClass):
Una clase heredadora
ex:
class YourClass(Object):
Una clase heredada
Una clase puede heredar de otra: los atributos de la clase 'se heredan', en particular, sus métodos se heredan, esto significa que las instancias de una clase heredadora (secundaria) pueden acceder atribuidas a la clase heredada (principal)
instancia -> clase -> luego clases heredadas
utilizando
import inspect
inspect.getmro(MyClass)
le mostrará la jerarquía, dentro de Python.