Método De Resolução, A Fim De Erro
-
12-12-2019 - |
Pergunta
Esta é mais uma questão de curiosidade, em vez de um problema sério:
Eu estava brincando com a herança múltipla e veio todo este:
>>> class A(object):
... def __init__(self): print "A.__init__() called"
...
>>> class B(object, A): pass
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Cannot create consisten method resolution
order (MRO) for bases object, A
Eu recebo um TypeError
.No entanto, quando eu inverter a ordem de herança múltipla:
>>> class B(A, object): pass
>>> b = B()
A.__init__() called
Ele funciona muito bem.Eu achava que, em primeira instância, a herança de object
antes de A
cria algum tipo de nome de ambiguidade.Teria alguém se importa de explicar o que está acontecendo aqui?
Solução
A
é herdada a partir de object
ou subclasse de object
, ele não funciona.O MRO garante que mais à esquerda bases são visitados antes de mais à direita - mas ele também garante que entre os ancestrais se x é uma subclasse de y, então x é visitado antes de y.É impossível satisfazer ambos os garantias, neste caso,
Aqui está uma pergunta semelhante
Python:Problema com metaclasses em conjunto herança múltipla