Как переопределить метод наследованого класса в python оставив прошлый функционал?
Столкнулся с такой задачей при работе с Django, что мне нужно добавить несколько строк кода в существующий метод, но при этом оставить весь оригинальный код. То есть не изменить полностью функцию, а только добавить в неё функционал. Как можно это сделать в python?
Пример:
@admin.register(Task)
class TaskAdmin(admin.ModelAdmin):
def response_change(self, request, obj):
if "stop-task" in request.POST:
task.stop_calculation(obj.task_id, request.user.id)
return HttpResponseRedirect(".")
Когда я добавляю действие для своей кнопки в админ панели Django, то все оригинальные кнопки ломаются, так как код, который отвечает за их работу больше нет. А копировать огромный участок кода из оригинального метода и вставлять себе мне кажется неправильно и неудобно.
Ответы (2 шт):
Если ДО или ПОСЛЕ базового функционала, то через super(), в классе это будет работать так
class A:
def test(self):
print('A')
class B(A):
def test(self):
super().test() # До
print('B')
# super().test() # После
Если надо вписаться в середину, то только копипаст или разделяйте метод на более мелкие методы
В моём случае решение оказалось таким:
@admin.register(Task)
class TaskAdmin(admin.ModelAdmin):
def response_change(self, request, obj):
if "stop-task" in request.POST:
task.stop_calculation(obj.task_id, request.user.id)
return HttpResponseRedirect(".")
return super(TaskAdmin, self).response_change(request, obj)
Не до конца понимаю как работает конструкция return super(TaskAdmin, self).response_change(request, obj), кто знает напишите, пожалуйста, в комментарии.