В django.utils.functional.py
:
for t in type(res).mro(): # <----- this
if t in self.__dispatch:
return self.__dispatch[t][funcname](res, *args, **kw)
Я не понимаю mro()
. Что он делает и что означает "mro"?
python
method-resolution-order
zjm1126
источник
источник
Ответы:
Следуйте ...:
Пока у нас есть единичное наследование,
__mro__
это просто кортеж из: класса, его базы, его базы и т. Д.object
(Работает, конечно, только для классов нового стиля).Теперь с множественным наследованием ...:
... вы также получаете уверенность в том, что
__mro__
ни один класс не дублируется и ни один класс не идет после своих предков, за исключением тех классов, которые сначала входят на одном уровне множественного наследования (например, B и C в этом примере), находятся в__mro__
слева направо.Каждый атрибут, который вы получаете в экземпляре класса, а не только методы, концептуально просматривается вдоль
__mro__
, поэтому, если более одного класса среди предков определяют это имя, это сообщает вам, где будет найден атрибут - в первом классе в то,__mro__
что определяет это имя.источник
mro
может быть настроен с помощью метакласса, вызывается один раз при инициализации класса, а результат сохраняется в__mro__
- см. docs.python.org/library/… .mro()
означает Порядок разрешения методов. Он возвращает список типов, производных от класса, в порядке их поиска для методов.mro () или __mro__ работает только с новыми классами стилей. В python 3 они работают без проблем. Но в Python 2 эти классы должны наследовать от
object
.источник
Возможно, это покажет порядок разрешения.
и ответ будет
Правило - сначала глубина, что в данном случае будет означать D, B, A, C.
Python обычно использует порядок глубины при поиске наследующих классов, но когда два класса наследуются от одного и того же класса, Python удаляет первое упоминание этого класса из mro.
источник
Порядок разрешения будет другим в наследовании алмазов.
источник
class B3
а во втором случае идетclass A
послеclass B1