Dans django.utils.functional.py
:
for t in type(res).mro(): # <----- this
if t in self.__dispatch:
return self.__dispatch[t][funcname](res, *args, **kw)
Je ne comprends pas mro()
. Que fait-il et que signifie «mro»?
python
method-resolution-order
zjm1126
la source
la source
Réponses:
Suivre...:
Tant que nous avons un héritage unique,
__mro__
est juste le tuple de: la classe, sa base, la base de sa base, et ainsi de suite jusqu'àobject
(ne fonctionne que pour les classes de nouveau style bien sûr).Maintenant, avec l' héritage multiple ...:
... vous avez également l'assurance que, dans
__mro__
qu'aucune classe n'est dupliquée et qu'aucune classe ne vient après ses ancêtres, sauf que les classes qui entrent en premier au même niveau d'héritage multiple (comme B et C dans cet exemple) sont dans le__mro__
de gauche à droite.Chaque attribut que vous obtenez sur l'instance d'une classe, pas seulement les méthodes, est recherché conceptuellement le long du
__mro__
, donc, si plus d'une classe parmi les ancêtres définit ce nom, cela vous indique où l'attribut sera trouvé - dans la première classe de le__mro__
qui définit ce nom.la source
mro
peut être personnalisé par une métaclasse, est appelé une fois à l'initialisation de la classe et le résultat est stocké dans__mro__
- voir docs.python.org/library/… .mro()
signifie Ordre de résolution des méthodes. Il renvoie une liste de types dont la classe est dérivée, dans l'ordre dans lequel les méthodes sont recherchées.mro () ou __mro__ ne fonctionne que sur les nouvelles classes de style. En python 3, ils fonctionnent sans aucun problème. Mais en python 2, ces classes doivent hériter de
object
.la source
Cela montrerait peut-être l'ordre de résolution.
et la réponse serait
La règle est la profondeur d'abord, ce qui dans ce cas signifierait D, B, A, C.
Python utilise normalement un ordre de profondeur d'abord lors de la recherche de classes héritées, mais lorsque deux classes héritent de la même classe, Python supprime la première mention de cette classe de mro.
la source
L'ordre de résolution sera différent dans l'héritage de diamants.
la source
class B3
mais dans le second cas c'est allerclass A
aprèsclass B1