Python.use(better)
《前の記事|記事一覧|次の記事》
Python.use(better)
実録:はじめてのプログラミング《14》クラス(0)要求仕様
《関連記事》-
■ 概要
OOP を学習するための題材として、スタックを作成します。
。
《Note》JPython1.1.x/Jython2.1.x 用に作成したセミナー課題を、Jython2.5 で再構成しました。
スタック課題(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 が得られます。
仕様を確認したので、これから、課題が完成するまでの過程を追跡します。
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("{0}:".format(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__ を利用すると便利です。
↑TOP
関連記事
- 実録 はじめての…《14》クラス(0)要求仕様 - 続・ひよ子のきもち《Python2.x》
- 2002-02-04 Python.use(better) #list: step00 -- class myList