Em django.utils.functional.py
:
for t in type(res).mro(): # <----- this
if t in self.__dispatch:
return self.__dispatch[t][funcname](res, *args, **kw)
Eu não entendo mro()
. O que faz e o que significa "mro"?
python
method-resolution-order
zjm1126
fonte
fonte
Respostas:
Acompanhe ...:
Desde que tenhamos uma herança única,
__mro__
é apenas a tupla de: a classe, sua base, sua base e assim por diante.object
(funciona apenas para classes de novo estilo, é claro).Agora, com herança múltipla ...:
... você também tem a garantia de que, em
__mro__
, nenhuma classe é duplicada e nenhuma classe vem após seus ancestrais, exceto que as classes que primeiro entram no mesmo nível de herança múltipla (como B e C neste exemplo) estão no__mro__
esquerda para a direita.Todos os atributos que você obtém na instância de uma classe, não apenas métodos, são conceitualmente pesquisados ao longo de
__mro__
, portanto, se mais de uma classe entre os ancestrais definir esse nome, isso informa onde o atributo será encontrado - na primeira classe em o__mro__
que define esse nome.fonte
mro
pode ser personalizado por uma metaclasse, é chamado uma vez na inicialização da classe e o resultado é armazenado em__mro__
- consulte docs.python.org/library/… .mro()
significa Ordem de resolução de método. Ele retorna uma lista de tipos dos quais a classe é derivada, na ordem em que são pesquisados por métodos.mro () ou __mro__ funciona apenas em novas classes de estilo. No python 3, eles funcionam sem problemas. Mas no python 2 essas classes precisam herdar
object
.fonte
Talvez isso mostre a ordem da resolução.
e resposta seria
A regra é a profundidade em primeiro lugar, o que neste caso significaria D, B, A, C.
O Python normalmente usa uma ordem de profundidade ao pesquisar classes herdadas, mas quando duas classes são herdadas da mesma classe, o Python remove a primeira menção dessa classe do mro.
fonte
A ordem da resolução será diferente na herança do diamante.
fonte
class B3
mas no segundo caso, é ir paraclass A
depoisclass B1