《14》クラス(0)要求仕様〈Python 2.x 版〉

実録:はじめてのプログラミング記事一覧
《14》クラス(0)要求仕様

《著》小粒ちゃん+α《監修》小泉ひよ子とタマゴ倶楽部
2009年2月2日(月)

今日の進捗

  • 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__ を利用すると便利です。《うさぎ》

Last updated♪09/03/08