如何在Python中创建一系列文本菜单

时间:2011-12-04 17:54:51

标签: python design-patterns menu

我正在编写一个小程序,打印一个包含选项列表的菜单屏幕。如果您选择其中一个选项,屏幕将被清除,您将进入下一个菜单。

现在,我已经创建了一个基本的Menu类,并为它提供了一个方法draw()来绘制选项。然后,我想添加另一个方法handle_options(),该方法接受用户输入,然后将用户提供给适当的选择。

目前,我正在创建一系列子类,如class MainMenu(Menu)class OptionsMenu(Menu)。当handle_options()循环时,我将创建相应Menu类的实例,并绘制它,然后循环到选项选项。

但事实是,我不想为Menu的每个变体定义这个handle_options()方法。所以我问:

a)是否有设计模式或更好的方式来做这种我可以学习的东西?

b)我可以使用getattr(self, "myfunc")()之类的东西来调用我存储在数组中的函数名,因此我可以将handle_options()方法归类化并在基类Menu类中定义它,而不是每个子类?

tl; dr - 可以使用哪些示例或模式来构建简单的基于文本的菜单系统?

1 个答案:

答案 0 :(得分:4)

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来推断出一个好的设计。