2011-12-04 8 views
1

私はオプションのリストをメニュー画面に表示する小さなプログラムを書いています。いずれかのオプションを選択すると、画面はクリアされ、次のメニューに移動します。Pythonで一連のテキストメニューを作成するには

今、基本メニュークラスを作成し、オプションを描画するメソッドdraw()を与えました。次に、別の方法handle_options()を追加して、ユーザーの入力を受け取り、ユーザーを適切な選択肢に振りかざします。

現時点では、class MainMenu(Menu)class OptionsMenu(Menu)のような一連のサブクラスを作成しています。 handle_options()がループしているときは、適切なMenuクラスのインスタンスを作成して描画し、オプションの選択肢にループします。

しかし、事実ですが、私はこのhandle_options()メソッドをMenuの各変形に対して定義する必要はありません。だから私は尋ねます:

a)私が学ぶことができるこの種のことをするためのデザインパターンやより良い方法がありますか?

b)getattr(self, "myfunc")()のようなものを使用して、配列に格納された関数名を呼び出すことができます。handle_options()メソッドを汎用化し、各サブクラスではなく基本メニュークラスで定義できますか?

tl; dr - 単純なテキストベースのメニューシステムを構築するために、どのような例やパターンを使用できますか?

答えて

3

Menuのすべてのサブクラスのためhandle_optionsを定義する代わりに、関数呼び出しのオプションをマップする辞書を定義することです:今、あなたのサブクラスは、単にself._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" 

各オプション:

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

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

    def optionC(self): 
     # ... 

    def optionD(self): 
     # ... 

あなたのドロー機能は、単にOPTIを反復処理することができますので、あなたはまた、例えば、テキストの説明を提供するself._optionsに展開することができますそれぞれに印刷します。 argparseを使って良いデザインを推論する方法を見てみましょう。

+0

テキストの説明を提供するためにself._optionsをどのように拡張できますか? – dman

関連する問題