Liste todas as classes base em uma hierarquia de determinada classe?
-
05-07-2019 - |
Pergunta
Dada uma Foo
classe (se é um nova classe de estilo ou não), como você gerar todas as classes de base - em qualquer lugar na hierarquia de herança - que issubclass
de?
Solução
inspect.getmro(cls)
funciona tanto para novos e antigos classes de estilo e retorna o mesmo que NewClass.mro()
:. uma lista de classe e todas as suas classes ancestrais, na ordem usado para resolução de método
>>> class A(object):
>>> pass
>>>
>>> class B(A):
>>> pass
>>>
>>> import inspect
>>> inspect.getmro(B)
(<class '__main__.B'>, <class '__main__.A'>, <type 'object'>)
Outras dicas
Veja a propriedade __bases__
disponível em um class
python, que contém uma tupla das classes bases:
>>> 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()
irá criar uma lista aninhada de classes e suas bases.
Uso:
inspect.getclasstree(inspect.getmro(IOError)) # Insert your Class instead of IOError.
Você pode usar o tuple __bases__
do objeto de classe:
class A(object, B, C):
def __init__(self):
pass
print A.__bases__
A tupla retornada por __bases__
tem todas as suas classes de base.
Espero que ajude!
Embora a resposta de Jochen é muito útil e correto, como você pode obter a hierarquia de classe usando o método .getmro () do inspecionar módulo, também é importante destacar que a hierarquia de herança de Python é a seguinte:
ex:
class MyClass(YourClass):
Uma classe herdando
- classe Child
- classe derivada
- subclasse
ex:
class YourClass(Object):
Uma classe herdada
- classe Parent
- Classe base
- Superclasse
Uma classe pode herdar de outra - A classe atribuído são herdadas - em particular, os seus métodos são herdadas - Isso significa que instâncias de uma classe (filha) herdando pode acessar atribuídos do (pai) classe herdada
instância -> class -> aulas então herdadas
usando
import inspect
inspect.getmro(MyClass)
irá mostrar-lhe a hierarquia, dentro de Python.
Em Python 3.7 você não precisa importar inspecionar, type.mro lhe dará o resultado.
>>> class A:
... pass
...
>>> class B(A):
... pass
...
>>> type.mro(B)
[<class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
>>>
atenção que em python 3.x cada classe herda de classe de objeto base.