Como posso obter as classes pai de uma classe Python?
202
Use o seguinte atributo:
cls.__bases__
Dos documentos :
A tupla de classes base de um objeto de classe.
Exemplo:
>>> str.__bases__
(<type 'basestring'>,)
Outro exemplo:
>>> class A(object):
... pass
...
>>> class B(object):
... pass
...
>>> class C(A, B):
... pass
...
>>> C.__bases__
(<class '__main__.A'>, <class '__main__.B'>)
type(C()).__bases__
o mencionado abaixoSe você deseja todos os ancestrais, e não apenas os ancestrais , use inspect.getmro :
De maneira útil, isso fornece a você todas as classes de ancestrais na "ordem de resolução do método" - isto é, a ordem na qual os ancestrais serão verificados ao resolver um método (ou, na verdade, qualquer outro atributo - métodos e outros atributos vivem no mesmo espaço de nome) afinal, em Python ;-).
fonte
cls.__mro__
(pelo menos em Python 3.5)As classes de novo estilo têm um método mro que você pode chamar, que retorna uma lista de classes pai na ordem de resolução do método.
fonte
object
não parece respondermro
.x
, podemos obter a ordem de resolução do método com a chamadatype(x).mro()
que podemos considerar sex
tiverClassX
como classe base:ClassX in type(x).mro()
A maneira MAIS RÁPIDA , para ver todos os pais, e EM ORDEM , basta usar o
__mro__
ie
repr(YOUR_CLASS.__mro__)
saídas, EM ORDEM
Aí está. A "melhor" resposta no momento tem 182 votos (enquanto digito isso), mas isso é MUITO mais simples do que um loop for complicado, procurando nas bases uma classe de cada vez, sem mencionar quando uma classe estende DOIS ou mais pais Aulas. Importando e usando
inspect
apenas obscurece o escopo desnecessariamente. Sinceramente, é uma pena que as pessoas não saibam usar apenas os embutidosEu espero que isso ajude!
fonte
inspect.getmro
basta chamar o__mro__
objeto, como você pode ver em github.com/python/cpython/blob/… . Usargetmro
produz código mais limpo e mais legível. Embora pular uma chamada de função seja realmente mais rápido.Use bases se você quiser apenas obter os pais, use
__mro__
(como indicado por @ naught101) para obter a ordem de resolução do método (para saber em qual ordem os init foram executados).Bases (e primeiro obtendo a classe para um objeto existente):
Para mro nas versões recentes do Python:
Obviamente, quando você já tem uma definição de classe, basta acessar
__mro__
diretamente:fonte
Se você quiser garantir que todos sejam chamados, use
super
em todos os níveis.fonte