我正在编写一个小程序,打印一个包含选项列表的菜单屏幕。如果您选择其中一个选项,屏幕将被清除,您将进入下一个菜单。
现在,我已经创建了一个基本的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 - 可以使用哪些示例或模式来构建简单的基于文本的菜单系统?
答案 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来推断出一个好的设计。