W django.utils.functional.py
:
for t in type(res).mro(): # <----- this
if t in self.__dispatch:
return self.__dispatch[t][funcname](res, *args, **kw)
Nie rozumiem mro()
. Co to robi i co oznacza „mro”?
python
method-resolution-order
zjm1126
źródło
źródło
Odpowiedzi:
Idź dalej ...:
Dopóki mamy pojedyncze dziedziczenie,
__mro__
jest to po prostu krotka: klasa, jej baza, jej baza itd., Aż doobject
(oczywiście działa tylko dla klas w nowym stylu).Teraz z dziedziczeniem wielokrotnym ...:
... zyskujesz również pewność, że w programie
__mro__
żadna klasa nie jest zduplikowana i żadna klasa nie występuje po swoich przodkach, poza tym, że klasy, które jako pierwsze wchodzą na ten sam poziom dziedziczenia wielokrotnego (jak B i C w tym przykładzie) znajdują się w__mro__
z lewej na prawą.Każdy atrybut, który otrzymujesz w instancji klasy, a nie tylko metody, jest koncepcyjnie przeglądany wzdłuż
__mro__
, więc jeśli więcej niż jedna klasa wśród przodków definiuje tę nazwę, to mówi ci, gdzie zostanie znaleziony atrybut - w pierwszej klasie w__mro__
który definiuje tę nazwę.źródło
mro
można dostosować za pomocą metaklasy, jest wywoływana raz podczas inicjalizacji klasy, a wynik jest przechowywany w__mro__
- patrz docs.python.org/library/… .mro()
oznacza Method Resolution Order. Zwraca listę typów, z których pochodzi klasa, w kolejności wyszukiwania metod.mro () lub __mro__ działa tylko na nowych klasach stylów. W Pythonie 3 działają bez żadnych problemów. Ale w Pythonie 2 te klasy muszą dziedziczyć z
object
.źródło
To być może pokazałoby kolejność rozdzielczości.
a odpowiedź byłaby
Reguła jest głębi, co w tym przypadku oznaczałoby D, B, A, C.
Python zwykle używa kolejności od początku do głębi podczas wyszukiwania klas dziedziczących, ale gdy dwie klasy dziedziczą z tej samej klasy, Python usuwa pierwszą wzmiankę o tej klasie z mro.
źródło
Kolejność rozdzielczości będzie inna w przypadku dziedziczenia diamentów.
źródło
class B3
ale w drugim przypadku idzieclass A
poclass B1