Module (19%)
Section (44%)

Объектный подход: стек с нуля

Теперь пришло время для двух функций (методов), реализующих операции push и pop. Python предполагает, что такая функция (активность класса) должна быть погружена в тело класса - как конструктор.

Мы хотим вызвать эти функции для значений push и pop. Это означает, что они оба должны быть доступны для каждого пользователя класса (в отличие от ранее созданного списка, который скрыт от пользователей обычного класса).

Такой компонент называется публичным, поэтому его имя не должно начинаться с двух (или более) подчеркиваний. Есть еще одно требование - имя должно содержать не более одного завершающего подчеркивания. Поскольку ни одно подчеркивание не полностью соответствует требованию, Вы можете предположить, что имя является приемлемым.

Сами функции просты. Посмотрите:

class Stack: def __init__(self): self.__stack_list = [] def push(self, val): self.__stack_list.append(val) def pop(self): val = self.__stack_list[-1] del self.__stack_list[-1] return val stack_object = Stack() stack_object.push(3) stack_object.push(2) stack_object.push(1) print(stack_object.pop()) print(stack_object.pop()) print(stack_object.pop())

Однако в коде есть что-то действительно странное. Функции выглядят знакомо, но у них больше параметров, чем у их процедурных аналогов.

Здесь обе функции имеют параметр с именем self в первой позиции списка параметров.

Это нужно? Да, это нужно.

 

Все методы должны иметь этот параметр. Он играет ту же роль, что и первый параметр конструктора.

Он позволяет методу получать доступ к объектам (свойствам и действиям/методам), выполняемым фактическим объектом. Вы не можете опустить это. Каждый раз, когда Python вызывает метод, он неявно отправляет текущий объект в качестве первого аргумента.

Это означает, что метод обязан иметь хотя бы один параметр, который используется самим Python - Вы не имеете на это никакого влияния.

 

Если вашему методу вообще не нужны параметры, этот должен быть указан в любом случае. Если он предназначен для обработки только одного параметра, Вам нужно указать два, а роль первого остается той же.

Есть еще одна вещь, требующая объяснения - способ вызова методов из переменной __stackList.

К счастью, это намного проще, чем кажется:

  • на первом этапе объект доставляется как единое целое; → self;
  • затем вам нужно попасть в список __stackListself.__stackList;
  • с __stackList готовым к использованию, Вы можете выполнить третий и последний шаг → self.__stackList.append(Val).
 

Объявление класса завершено, и все его компоненты перечислены. Класс готов к использованию.



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


stackObject = Stack()

stackObject.push(3)
stackObject.push(2)
stackObject.push(1)

print(stackObject.pop())
print(stackObject.pop())
print(stackObject.pop())
{{ dockerServerErrorMsg }} ×
{{ errorMsg }} ×
{{ successMsg }} ×