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

3 投票
1 回答
3516 浏览
提问于 2025-04-17 07:40

我正在写一个小程序,程序会显示一个菜单界面,上面有一系列选项。如果你选择了其中一个选项,屏幕就会清空,然后进入下一个菜单。

现在,我已经创建了一个基础的菜单类,并给它添加了一个叫做 draw() 的方法,这个方法用来绘制选项。接下来,我想再添加一个方法 handle_options(),这个方法可以接收用户的输入,然后根据选择带用户进入相应的选项。

目前,我正在创建一些子类,比如 class MainMenu(Menu)class OptionsMenu(Menu)。当 handle_options() 循环运行时,我会创建一个合适的菜单类的实例,绘制它,然后进入选项选择的循环。

但是,我不想为每个菜单的变种都定义这个 handle_options() 方法。所以我想问:

a) 有没有什么设计模式或者更好的方法可以让我学习,来处理这种情况?

b) 我能不能用类似 getattr(self, "myfunc")() 的方式,调用我存储在数组中的函数名,这样我就可以把 handle_options() 方法通用化,放在基础菜单类中,而不是每个子类都定义一次?

总结一下 - 有哪些例子或模式可以用来构建一个简单的基于文本的菜单系统?

1 个回答

4

一个替代方案是,不必为每个Menu的子类都定义handle_options,而是可以定义一个字典,这个字典把选项和函数调用对应起来:

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

撰写回答