《14》クラス(0)要求仕様〈Python 2.x 版〉
実録:はじめてのプログラミング《記事一覧》
《14》クラス(0)要求仕様
関連記事
- 実録《14》クラス(0)要求仕様《Python3.1》 - 続・ひよ子のきもち 《Python3.0》
今日の進捗
- Tutorial: Brief Tour of the Standard Library – Part II
- Python.use(better) -- セミナー研修テキスト
- スタック課題を「続・ひよ子のきもち」で公開
Comment | |
---|---|
本人:野中 | とうとう今週で最後ですがなるだけ多くのことを吸収したいです。 |
担当:本間 | 研修用テキストだと、データ構造と一緒にイテレーター式を紹介してるけど、公式マニュアルではクラスと一緒に紹介してるので、再確認しておいてね。(^^) |
参考文献 | note |
---|---|
スタックとは - IT用語辞典 e-Words | 「スタック」の要点を分かりやすく解説 |
スタック課題(0)要求仕様
《step 1》スタックを利用して、push/pop 操作ができるようにします。
スタック課題を作成しながら、クラスについて学びます。
def ex(): stack = Stack() ; print stack stack.push("A") ; print stack stack.push("B") ; print stack stack.push("C") ; print stack s = stack.pop() ; print stack, s s = stack.pop() ; print stack, s s = stack.pop() ; print stack, s s = stack.pop() ; print stack, s >>> ex() ['A'] ['A', 'B'] ['A', 'B', 'C'] ['A', 'B'] C ['A'] B A Stack: pop from empty stack [] None
スタックを生成 Stack() したら、後入れ先出し〔last-in first-out; LIFO〕の原則に沿って、メソッド push を利用してスタックに要素を積み、メソッド pop を利用してスタックから要素を降ろします。ただし、空のスタックに pop を適用すると、エラーメッセージが出力され、リターン値として None が得られます。
スタック課題の仕様を確認したので、これから、クラス Stack が完成するまでの過程を紹介します。
class Stack(list): def push(self, item): self.append(item)
まず、組み込み型 list を拡張する方法を試します。pop 操作は、メソッド list.pop を再利用できるので、push 操作だけを実現します。
何が問題か
これには問題があります。たとえば、
>>> ex() ['A'] ['A', 'B'] ['A', 'B', 'C'] ['A', 'B'] C ['A'] B A Traceback (most recent call last): ... s = stack.pop() ; print stack, s IndexError: pop from empty list
空のスタックに pop を適用すると、例外 IndexError を生成して、エラーメッセージが出力されます。そこで、
class Stack(list): def push(self, item): self.append(item) def pop(self): try: return super(Stack, self).pop() except: print "%s: %s"%(self.__class__.__name__, "pop from empty stack")
メソッド pop を再定義して、空のスタックに pop を適用したときには、例外を補足するとともに、エラーメッセージを出力させます。例外を補足して処理するには、try/except を利用すると便利です。すると、
>>> ex() ['A'] ['A', 'B'] ['A', 'B', 'C'] ['A', 'B'] C ['A'] B A Stack: pop from empty stack [] None
エラーメッセージを出力するとともに、リターン値として None が得られます。
Tips
親クラスのメソッドを再利用するときには、組み込み関数 super を利用します。また、実行時にクラス名を埋め込みたいときには、属性 __class__.__name__ を利用すると便利です。《うさぎ》