Объектный подход: стек с нуля (продолжение)
Во-вторых, давайте добавим два метода. Но позвольте спросить Вас: это действительно добавляет? У нас уже есть эти методы в суперклассе. Можем ли мы сделать что-то подобное?
Да, мы можем. Это означает, что мы собираемся изменить функциональность методов, а не их имена. Можно сказать более точно, что интерфейс (способ обработки объектов) класса остается неизменным при одновременном изменении реализации.
Давайте начнем с реализации функции push
. Вот, что мы ожидаем от нее:
- добавить значение в переменную
__sum
; - поместить значение в стек.
Примечание: второе действие уже реализовано внутри суперкласса - так что мы можем использовать это. Кроме того, мы должны использовать его, так как нет другого способа получить доступ к переменной __stackList
.
Вот как выглядит метод push
в подклассе:
def push(self, val):
self.__sum += val
Stack.push(self, val)
Обратите внимание, как мы вызывали предыдущую реализацию метода push
(который доступен в суперклассе):
- мы должны указать имя суперкласса; это необходимо для того, чтобы четко указать класс, содержащий метод, чтобы не путать его с любой другой функцией с тем же именем;
- мы должны указать целевой объект и передать его в качестве первого аргумента (он неявно добавляется к вызову в этом контексте.)
Мы говорим, что метод push
был переопределен - то же имя, что и в суперклассе, теперь представляет другую функциональность.
Code
class Stack:def __init__(self):
self.__stackList = []
def push(self, val):
self.__stackList.append(val)
def pop(self):
val = self.__stackList[-1]
del self.__stackList[-1]
return val
class AddingStack(Stack):
def __init__(self):
Stack.__init__(self)
self.__sum = 0
# Enter code here.