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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top