In django.utils.functional.py
:
for t in type(res).mro(): # <----- this
if t in self.__dispatch:
return self.__dispatch[t][funcname](res, *args, **kw)
Das verstehe ich nicht mro()
. Was macht es und was bedeutet "mro"?
python
method-resolution-order
zjm1126
quelle
quelle
Antworten:
Folgen...:
Solange wir eine einzelne Vererbung haben,
__mro__
ist dies nur das Tupel von: der Klasse, ihrer Basis, der Basis ihrer Basis usw. bisobject
(funktioniert natürlich nur für Klassen neuen Stils).Jetzt mit Mehrfachvererbung ...:
... Sie erhalten auch die Gewissheit, dass in
__mro__
keine Klasse dupliziert wird und keine Klasse nach ihren Vorfahren kommt, außer dass Klassen, die zuerst auf derselben Ebene der Mehrfachvererbung eingegeben werden (wie B und C in diesem Beispiel), in der__mro__
links nach rechts.Jedes Attribut, das Sie auf der Instanz einer Klasse erhalten, nicht nur Methoden, wird konzeptionell entlang der nachgeschlagen.
__mro__
Wenn also mehr als eine Klasse unter den Vorfahren diesen Namen definiert, erfahren Sie, wo sich das Attribut befindet - in der ersten Klasse in das__mro__
, das diesen Namen definiert.quelle
mro
kann durch eine Metaklasse angepasst werden, wird bei der Klasseninitialisierung einmal aufgerufen und das Ergebnis wird in gespeichert__mro__
- siehe docs.python.org/library/… .mro()
steht für Method Resolution Order. Es gibt eine Liste der Typen zurück, von denen die Klasse abgeleitet ist, in der Reihenfolge, in der nach Methoden gesucht wird.mro () oder __mro__ funktioniert nur bei neuen Stilklassen . In Python 3 funktionieren sie ohne Probleme. In Python 2 müssen diese Klassen jedoch erben
object
.quelle
Dies würde vielleicht die Reihenfolge der Auflösung zeigen.
und Antwort wäre
Die Regel lautet "Tiefe zuerst", was in diesem Fall D, B, A, C bedeuten würde.
Python verwendet normalerweise eine Tiefen-First- Reihenfolge bei der Suche nach ererbenden Klassen. Wenn jedoch zwei Klassen von derselben Klasse erben, entfernt Python die erste Erwähnung dieser Klasse aus mro.
quelle
Die Reihenfolge der Auflösung unterscheidet sich in der Diamantvererbung.
quelle
class B3
aber im zweiten Fall geht esclass A
nachclass B1