Есть три функции, которые делят состояние: menu_1
, menu_2
, main_menu
.
Состояние хранит только имя. Тем не менее заведём класс State
c одним полем name
. Экземпляр состояния будем передавать в вызываемые функции как эстафетную палочку:
class State:
def __init__(self):
self.name = None
def menu_1(state):
state.name = input("Введите имя:")
main_menu(state)
def menu_2(state):
print("Имя: ", state.name)
main_menu(state)
def main_menu(state):
print("ГЛАВНОЕ МЕНЮ\n","1 — Ввести или обновить информацию\n","2 — Вывести информацию\n",
"0 — Завершить работу\n")
number_menu = int(input("Введите номер пункта меню:"))
if number_menu == 1:
menu_1(state)
elif number_menu == 2:
menu_2(state)
elif number_menu == 0:
print("Работа завершена!")
else:
print("Некорректный ввод меню!")
main_menu(state)
main_menu(State())
Идём дальше. Есть три функции, которые принимают один и тот же параметр. Не пора ли сделать их методами объекта? Методами State
? Делаем. Синтаксис меняется, семантика остаётся старой: три функции (теперь уже три метода объекта) перебрасывают друг другу общее состояние, по соглашению оно зовётся self
:
class State:
def __init__(self):
self.name = None
def menu_1(self):
self.name = input("Введите имя:")
self.main_menu()
def menu_2(self):
print("Имя: ", self.name)
self.main_menu()
def main_menu(self):
print("ГЛАВНОЕ МЕНЮ\n","1 — Ввести или обновить информацию\n","2 — Вывести информацию\n",
"0 — Завершить работу\n")
number_menu = int(input("Введите номер пункта меню:"))
if number_menu == 1:
self.menu_1()
elif number_menu == 2:
self.menu_2()
elif number_menu == 0:
print("Работа завершена!")
else:
print("Некорректный ввод меню!")
self.main_menu()
State().main_menu()
Решение рекурсивное, что не нужно и плохо. Через тысячу циклов Питон упадёт с ошибкой из-за слишком глубокой рекурсии. Меняем на цикл:
class State:
def __init__(self):
self.name = None
def menu_1(self):
self.name = input("Введите имя:")
def menu_2(self):
print("Имя: ", self.name)
def main_menu(self):
while True:
print("ГЛАВНОЕ МЕНЮ\n","1 — Ввести или обновить информацию\n","2 — Вывести информацию\n",
"0 — Завершить работу\n")
number_menu = int(input("Введите номер пункта меню:"))
if number_menu == 1:
self.menu_1()
elif number_menu == 2:
self.menu_2()
elif number_menu == 0:
print("Работа завершена!")
break
else:
print("Некорректный ввод меню!")
State().main_menu()
В принципе тут можно убрать методы menu_1
и menu_2
, но я этого делать не буду в расчёте на усложнение программы в будущем. Всю логику сложной программы в main_menu
не поместишь.