如何在Python中创建文本菜单系列
我正在写一个小程序,程序会显示一个菜单界面,上面有一系列选项。如果你选择了其中一个选项,屏幕就会清空,然后进入下一个菜单。
现在,我已经创建了一个基础的菜单类,并给它添加了一个叫做 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来推导出一个好的设计。