Tôi đã tạo một lớp phân lớp ListView
và hai mixin tùy chỉnh đã triển khai hàm get_context_data
. Tôi muốn ghi đè lên chức năng này vào các lớp con:Python đa chức năng thừa kế ghi đè và ListView trong 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
Khi tôi thực hiện MyListView
nó chỉ in "ListSortedMixin"
. Vì một số lý do, python đang thực hiện ListSortedMixin.get_context_data
thay cho MyListView.get_context_data
. Tại sao?
Nếu tôi thay đổi thứ tự kế thừa thành ListPaginatedMixin, ListSortedMixin, ListView
, ListPaginatedMixin.get_context_data
được thực hiện.
Tôi có thể ghi đè hàm get_context_data
như thế nào?
Trong trường hợp này 'super (MyListView, self) .get_context_data (** context)' giống như 'ListSortedMixin.get_context_data (self, ** context)'. Tôi nghĩ rằng [câu trả lời trước] (http://stackoverflow.com/a/9939867/959819) là chính xác: tôi cần phải gọi từng chức năng của cha mẹ. –
Vấn đề là mixins của bạn không gọi siêu. Ngay cả khi mixin kế thừa từ 'object' thì chúng sẽ gọi super. Đại biểu đại diện cho đối tượng tiếp theo trong MRO (thứ tự độ phân giải phương thức), phụ thuộc vào thứ tự mà chúng được chỉ định trong khai báo MyListView. Tôi sẽ cập nhật câu trả lời của tôi ở trên để làm cho nó rõ ràng hơn. –
Chính xác. Do đó phương thức được gọi trong ví dụ của bạn chỉ là 'ListSortedMixin'. Tôi cần phải gọi thủ công tất cả các chức năng của cha mẹ. –