Python.use(better)

前の記事記事一覧次の記事
Python.use(better)


実録:はじめてのプログラミング《14》

■ 概要

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


関連記事

Last updated♪2009/10/05