Как создать серию текстовых меню в Python - PullRequest
2 голосов
/ 04 декабря 2011

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

Сейчас я создал базовый класс Menu и дал ему метод draw(), который рисует опции. Затем я хочу добавить другой метод handle_options(), который принимает пользовательский ввод, а затем предлагает пользователю соответствующий выбор.

В данный момент я создаю серию подклассов, таких как class MainMenu(Menu) и class OptionsMenu(Menu). Когда handle_options() находится в цикле, я создам экземпляр соответствующего класса Menu и нарисую его, а затем переключусь на выбор параметров.

Но дело в том, что я не хочу определять этот метод handle_options() для каждого варианта Menu. Поэтому я спрашиваю:

а) Есть ли шаблон дизайна или лучший способ сделать такое, чему я могу научиться?

b) Могу ли я использовать что-то вроде getattr(self, "myfunc")() для вызова имени функции, которое я сохранил в массиве, чтобы я мог обобщить метод handle_options() и определить его в базовом классе меню, а не для каждого подкласса?

tl; dr - Какие примеры или шаблоны можно использовать для построения простой текстовой системы меню?

1 Ответ

4 голосов
/ 04 декабря 2011

Альтернативой определению handle_options для каждого подкласса Menu является определение dict, который отображает опцию для вызова функции:

class Menu(object):
   def __init__(self):
      # Ideally, self._options would be an empty dict for the base class.
      # This is just for the sake of example.
      self._options = {'a': self.optionA,
                       'b': self.optionB}

   def handle_options(self, option):
      if option not in self._options:
         print "Invalid option"
         # re-draw
         return

      self._options[option]()

   def optionA(self):
      print "option A"

   def optionB(self):
      print "option B"

Теперь ваши подклассы просто должны переопределить self._options и предоставить соответствующие методы, связанные с каждой опцией:

class SubMenu(Menu):
   def __init__(self):
      Menu.__init__(self)

      self._options = {'c': self.optionC,
                       'd': self.optionD}

   def optionC(self):
      # ...

   def optionD(self):
      # ...

Вы также можете расширить на self._options, чтобы предоставить, например, текстовое описание, чтобы ваша функция рисования могла просто перебирать варианты печати каждого из них. Посмотрите, как использовать argparse , чтобы сделать вывод о хорошем дизайне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...