《07》クラスに頼らない OOP(1)〈Python 3.0 版〉
《Previous| |Next》
Python à la carte《記事一覧》
《07》クラスに頼らない OOP(1)
関連記事
- C言語で始める OOP, 1988, 1994.
- 実録《14》クラス(0)要求仕様《Python3.1》 - 続・ひよ子のきもち〈Python 3.0 版〉
クラス指向(思考)からオブジェクト指向(思考)へ
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)が可能になります。