Dada uma classe Foo
(seja uma classe de novo estilo ou não), como você gera todas as classes base - em qualquer lugar da hierarquia de herança issubclass
?
Dada uma classe Foo
(seja uma classe de novo estilo ou não), como você gera todas as classes base - em qualquer lugar da hierarquia de herança issubclass
?
Respostas:
inspect.getmro(cls)
funciona para as classes de estilo novo e antigo e retorna o mesmo que NewClass.mro()
: uma lista da classe e todas as suas classes ancestrais, na ordem usada para a resolução do 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)
vez de inspect.getmro(type(obj))
.
Veja a __bases__
propriedade disponível em um python class
, que contém uma tupla das classes de 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>]
getmro
explicitamente diz "Nenhuma classe aparece mais de uma vez nesta tupla"?
__bases__
apenas sobe um nível . (Como sua utilidade recursiva implica, mas um breve olhar sobre o exemplo pode não pegar em que.)
inspect.getclasstree()
criará uma lista aninhada de classes e suas 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)))'
você pode usar a __bases__
tupla do objeto de classe:
class A(object, B, C):
def __init__(self):
pass
print A.__bases__
A tupla retornada por __bases__
possui todas as suas classes base.
Espero que ajude!
__bases__
No python 3.7, você não precisa importar, inspecione, type.mro fornecerá o resultado.
>>> class A:
... pass
...
>>> class B(A):
... pass
...
>>> type.mro(B)
[<class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
>>>
atenção que no python 3.x toda classe herda da classe de objeto base.
De acordo com o documento Python , também podemos simplesmente usar class.__mro__
atributo ou 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
Embora a resposta de Jochen seja muito útil e correta, como você pode obter a hierarquia de classes usando o método .getmro () do módulo inspecionar, também é importante destacar que a hierarquia de herança do Python é a seguinte:
ex:
class MyClass(YourClass):
Uma classe herdada
ex:
class YourClass(Object):
Uma classe herdada
Uma classe pode herdar de outra - A classe atribuída é herdada - em particular, seus métodos são herdados - isso significa que instâncias de uma classe herdada (filho) podem acessar atribuídas à classe herdada (pai)
instância -> classe -> classes herdadas
usando
import inspect
inspect.getmro(MyClass)
mostrará a hierarquia no Python.