Utworzono klasę podklasową ListView
i dwie niestandardowe składanki, które zaimplementowały funkcję get_context_data
. Chciałem, aby zastąpić tę funkcję w klasie dziecko:Nadpisywanie funkcji wielu dziedziczeń w języku Python i ListView w django
from django.views.generic import ListView
class ListSortedMixin(object):
def get_context_data(self, **kwargs):
print 'ListSortedMixin'
return kwargs
class ListPaginatedMixin(object):
def get_context_data(self, **kwargs):
print 'ListPaginatedMixin'
return kwargs
class MyListView(ListSortedMixin, ListPaginatedMixin, ListView):
def get_context_data(self, **context):
super(ListSortedMixin,self).get_context_data(**context)
super(ListPaginatedMixin,self).get_context_data(**context)
return context
Kiedy wykonać MyListView
to tylko drukuje "ListSortedMixin"
. Z jakiegoś powodu Python wykonuje ListSortedMixin.get_context_data
zamiast MyListView.get_context_data
. Czemu?
Jeśli zmienię kolejność dziedziczenia na ListPaginatedMixin, ListSortedMixin, ListView
, zostanie wykonana ListPaginatedMixin.get_context_data
.
Jak mogę przesłonić funkcję get_context_data
?
W tym przypadku 'super (MyListView, self) .get_context_data (kontekst **) jest taki sam jak' ListSortedMixin.get_context_data (self, ** context) '. Myślę, że [poprzednia odpowiedź] (http://stackoverflow.com/a/9939867/959819) jest poprawna: muszę wywoływać funkcje rodziców jeden po drugim. –
Problem polega na tym, że Twoje mixiny nie nazywają się super. Nawet jeśli mixiny dziedziczą po 'obiekcie', powinny wywoływać super. Super delegaci do następnego obiektu w MRO (kolejność rozstrzygania metod), która zależy od kolejności, w jakiej się znajdowali są określone w deklaracji MyListView. Zaktualizuję powyższą odpowiedź, aby była bardziej przejrzysta. –
Dokładnie. Dlatego wywoływana metoda w twoim przykładzie to tylko 'ListSortedMixin'. Muszę zadzwonić ręcznie wszystkie funkcje rodziców. –