aktualisieren
Als Harry Percival states in seinem Buch Test-Driven Web Development with Python:
Persönliche Meinung hier: Ich super
genutzt haben könnte, aber ich lieber nicht Verwendung super
wenn es Argumente erfordert, zum Beispiel zu bekommen eine Großelternmethode. Ich finde Python 3 super() ohne Argumente großartig, um die sofortige Eltern zu bekommen. Alles andere ist zu fehleranfällig, und ich finde es außerdem hässlich.
Dort ist die Lösung, die er gibt, die Großelternklasse und ihre Methode direkt aufzurufen.
Etwas in den Zeilen:
class C(B):
def get_queryset(self):
return A.get_queryset(self)
Welches ist Ihre erste Methode ist. Ich werde es definitiv annehmen. Vielen Dank!
Dies ist ein "einmaliger" Hack, um eine Methode einer Elternklasse vorübergehend zu überschreiben. Die Absicht ist, die Aufgabe zu erledigen, bis ein Refactoring stattfindet.
Sonst müssen Sie möglicherweise über das Design Ihrer Klassen wie Alex hingewiesen werden.
hatte ich die gleiche Frage, und schließlich kam ich auf die folgende Lösung:
class A:
def get_queryset(self):
# Do not hack around
class B(A):
from_c = False
def get_queryset(self):
if self.from_c:
# Here goes the C hack
else:
# Here goes the B hack
class C(B):
from_c = True
I know that:
Es sollte one-- sein und vorzugsweise nur eine --obvious Weg TU es.
Ich habe das Gefühl, dass meine "Lösung" nur ein dritter Weg zu einem Hack ist. Jedoch:
- Ich bin nicht Niederländisch.
- Um das Ausmaß Ihres Beispiel ist dieser Trick komplex und praktisch, aber nicht kompliziert
Es gibt keine Pythonic Weg, dies zu tun, denn es ist nicht etwas, was Sie tun sollten. Warum müssen Sie einen Teil des MRO überspringen? – jonrsharpe
Ich wette, Sie haben einen guten Grund nicht zu, aber nur für den Fall ...Was ist, wenn C von A statt von B geerbt hat? Spart Ihnen viel Mühe. – Kevin
Sie könnten Pythons verwenden name mangling 'A .__ open_spider' wird' c._A__open_spider' –