Что делает «mro ()»?

В 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»?

3 Solutions collect form web for “Что делает «mro ()»?”

Следуйте за …:

 >>> class A(object): pass ... >>> A.__mro__ (<class '__main__.A'>, <type 'object'>) >>> class B(A): pass ... >>> B.__mro__ (<class '__main__.B'>, <class '__main__.A'>, <type 'object'>) >>> class C(A): pass ... >>> C.__mro__ (<class '__main__.C'>, <class '__main__.A'>, <type 'object'>) >>> 

До тех пор, пока у нас есть одно наследование, __mro__ – это всего лишь кортеж: класс, его база, база базы и т. Д. До object (конечно, работает только для классов нового стиля).

Теперь, с множественным наследованием …:

 >>> class D(B, C): pass ... >>> D.__mro__ (<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <type 'object'>) 

… вы также получаете уверенность, что в __mro__ ни один класс не дублируется, и класс не следует за его предками, за исключением того, что классы, которые сначала вводятся на том же уровне множественного наследования (например, B и C в этом примере), находятся в __mro__ слева направо.

Каждый атрибут, который вы получаете на экземпляр класса, а не только на методы, концептуально просматривается вдоль __mro__ , поэтому, если более чем один класс среди предков определяет это имя, это говорит вам, где будет найден атрибут – в первом классе в __mro__ который определяет это имя.

mro() обозначает порядок разрешения метода. Он возвращает список типов, из которых происходит производный класс, в порядке их поиска.

Это, возможно, покажет порядок разрешения.

 class A(object): def dothis(self): print('I am from A class') class B(A): pass class C(object): def dothis(self): print('I am from C class') class D(B, C): pass d_instance= D() d_instance.dothis() print(D.mro()) 

и ответ будет

 I am from A class [<class '__main__.D'>, <class '__main__.B'>, <class '__main__.A'>, <class '__main__.C'>, <class 'object'>] 

Правило является первым делом, которое в этом случае будет означать D, B, A, C

Python обычно использует порядок глубины при поиске наследующих классов. Но когда два класса наследуются от одного и того же класса, Python удаляет первое упоминание этого класса из mro.

Interesting Posts

Отключить виджет с помощью кнопки checkbutton?

Python oauth для youtube

Как определить интерфейс пакета при прослушивании сетевого трафика на всех устройствах?

Обновление python в virtualenv

Ограничение Fps в python

разность тензорных потоков между сберегающей моделью через экспортер и tf.train.write_graph ()?

не удалось установить __main __.__ loader__ в Python

python3 восстанавливает исключение с помощью настраиваемого атрибута?

Является ли SSE невыровненной нагрузкой внутренней, чем медленная, чем выровненная нагрузка на процессоры Intel x64_64?

Как создать пространство имен Python (значение argparse.parse_args)?

Почему я получаю UnicodeDecodeError в кодировке JSON Python?

Google App Engine: не будет обслуживать статические активы с ошибкой ниже:

Python win32 com: как обрабатывать параметр «out»?

Почему значения «Not a Number» равны True, если в Python / Numpy используется как boolean?

Как создать временный файл в django, а затем уничтожить

Python - лучший язык программирования в мире.