《07》クラスに頼らない OOP(1)〈Python 3.0 版〉

Previous| |Next
Python à la carte記事一覧
《07》クラスに頼らない OOP(1)

《著》小粒ちゃん《監修》小泉ひよ子とタマゴ倶楽部
第1版♪2003/05/25 ● 第2版♪2004/06/01 ● 第3版♪2009/02/28

関連記事

クラス指向(思考)からオブジェクト指向(思考)へ

Java/C#オブジェクト指向プログラミング(OOP)を学び始めると「クラス」の存在に目を奪われて、ともすると、OOP の本質である「オブジェクト」の存在が蔑ろにされがちです。そこで「クラスに頼らない OOP」を体験することで、OOP の本質に迫るとともに、その醍醐味を堪能する術を学びます。

事例:OOP にクラスは必須か?

まず、次のコードの断片(関連する〈記事〉の抜粋)を見てください。

def ex2():
    stack = 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)

《Note》コロン「;」に続く print は、オブジェクトの状態を確認するためで、問題の本質には影響しません。■


これを実行すると、次のような結果が得られます。

>>> ex2()
['A']
['A', 'B']
['A', 'B', 'C']
['A', 'B'] 'C'
['A'] 'B'
 'A'
Stack: pop from empty stack
 None

一見すると、OOP を実践するのに、クラス Stack を利用しているかのように思えます。ところが、これと同じことを関数呼び出し Stack() でも実現できます。つまり、OOP を実践するのに「クラスは必須でない」ことを、これから実証しようというのです。

事例:関数を使って(非 OOP 版)

その理解を深めるために、伝統的な「関数」を使って実現した事例と比較します。

def ex1():
    stack = Stack()
    push(stack,"A")     ;print(stack)
    push(stack,"B")     ;print(stack)
    push(stack,"C")     ;print(stack)
    s = pop(stack)      ;print(stack,s)
    s = pop(stack)      ;print(stack,s)
    s = pop(stack)      ;print(stack,s)
    s = pop(stack)      ;print(stack,s)

ここでは、関数 push/pop を使って、スタック操作を実現しています。

第1引数に指定した stack は特別に扱われ(OOP 版では)これがメソッド呼び出しの対象になります。つまり、stack の「メソッド」push/pop を呼び出す代わりに、stack を第1引数に指定して「関数」push/pop を呼び出すのです。これを実行すると、

>>> ex1()
['A']
['A', 'B']
['A', 'B', 'C']
['A', 'B'] 'C'
['A'] 'B'
 'A'
Stack: pop from empty stack
 None

前述した ex2 と同じ結果が得られます。

Tips

その実現方法(how)に依存しない、共通の問題解決(what)が可能になります。

Last updated♪09/03/23