Como posso obter as classes pai de uma classe Python?
Como posso obter as classes pai de uma classe Python?
Respostas:
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'>)
Se você deseja todos os ancestrais, e não apenas os ancestrais , use inspect.getmro :
import inspect
print inspect.getmro(cls)
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 ;-).
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.
object
não parece responder mro
.
x
, podemos obter a ordem de resolução do método com a chamada type(x).mro()
que podemos considerar se x
tiver ClassX
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__)
>>>
>>>
>>> import getpass
>>> getpass.GetPassWarning.__mro__
saídas, EM ORDEM
(<class 'getpass.GetPassWarning'>, <type 'exceptions.UserWarning'>,
<type 'exceptions.Warning'>, <type 'exceptions.Exception'>,
<type 'exceptions.BaseException'>, <type 'object'>)
>>>
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 usandoinspect
apenas obscurece o escopo desnecessariamente. Sinceramente, é uma pena que as pessoas não saibam usar apenas os embutidos
Eu espero que isso ajude!
inspect.getmro
basta chamar o __mro__
objeto, como você pode ver em github.com/python/cpython/blob/… . Usar getmro
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):
>>> some_object = "some_text"
>>> some_object.__class__.__bases__
(object,)
Para mro nas versões recentes do Python:
>>> some_object = "some_text"
>>> some_object.__class__.__mro__
(str, object)
Obviamente, quando você já tem uma definição de classe, basta acessar __mro__
diretamente:
>>> class A(): pass
>>> A.__mro__
(__main__.A, object)
type(C()).__bases__
o mencionado abaixo