Ho creato una classe che suddivide le sottoclassi ListView
e due mixin personalizzati che hanno implementato una funzione get_context_data
. Ho voluto ignorare questa funzione sulla classe bambino:Override della funzione di ereditarietà multiplo di Python e ListView in 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
Quando eseguire MyListView
esso stampa solo "ListSortedMixin"
. Per qualche ragione Python sta eseguendo ListSortedMixin.get_context_data
al posto di MyListView.get_context_data
. Perché?
Se si modifica l'ordine di ereditarietà su ListPaginatedMixin, ListSortedMixin, ListView
, viene eseguito ListPaginatedMixin.get_context_data
.
Come si ignora la funzione get_context_data
?
In questo caso 'super (MyListView, self) .get_context_data (** context)' è lo stesso di 'ListSortedMixin.get_context_data (self, ** context)'. Penso che [la risposta precedente] (http://stackoverflow.com/a/9939867/959819) sia corretta: devo chiamare le funzioni dei genitori uno per uno. –
Il problema è che i tuoi mixin non chiamano super. Anche se i mixin ereditano da 'object' dovrebbero chiamare super. Super delegati all'oggetto successivo nell'MRO (ordine di risoluzione dei metodi), che dipende dall'ordine in cui sono stati specificati nella dichiarazione di MyListView. Aggiornerò la mia risposta sopra per renderla più chiara. –
Esattamente. Pertanto il metodo chiamato nel tuo esempio è solo "ListSortedMixin". Devo chiamare manualmente tutte le funzioni dei genitori. –