静かなる名辞

pythonとプログラミングのこと

オブジェクト指向の教育にPythonが向いていると思うこれだけの理由

はじめに

 オブジェクト指向は今となっては常識である。常識であるがゆえに、いかに初心者にわかりやすく教えるかが課題になる。

 世の中でオブジェクト指向の「教材」として使われている言語は、

 の二択くらいだと思う。が、あえて僕はPythonを推してみるよ、という記事。ぶっちゃけポエム。

 内容は、Javaオブジェクト指向を理解するのはしんどいし、RubyPythonだと僅差でPythonが勝つんじゃないかなぁ、という主張。以下で理由を書いていくよ。

 目次

Pythonが向いていると思う理由

理由1:すべてがオブジェクト

 すべてがオブジェクト。これは重要なことである。

 オブジェクトとオブジェクト以外で異なる扱いをしなければならない、プリミティブ型のある言語でオブジェクト指向の教育をするなんて、正気の沙汰ではない。初心者はintと配列ばっかり使う訳だしさ。

 なので、Javaはぶっちゃけ論外だと思う。Ruby使いの人は「ならPythonRubyは互角だ」と言いたくなるかもしれないけど、Rubyには関数が第一級オブジェクトではないという弱点があり、「すべてがオブジェクト」ははっきり言って誇大広告である。

 関数オブジェクトが自然に使えないと困るのかって? まあ、そんなに困らないかもしれない。でも「関数オブジェクト」は理解しておいた方が、オブジェクト指向がよくわかるようになると思わない?(上級者向けすぎるか)

理由2:仕様がスリムで綺麗。書きやすい

 Javaにはまず、publicやらprivateやらある。interfaceというわかりづらい概念もある。静的型付けなのも相まって、メソッドの宣言なんかカオス。public static void mainはどう考えても初心者向けではない*1

 Rubyは、なんかブロックとかいうよくわからないものがあるね。あと、メソッド呼び出しのカッコを省略できるとか。教育上あんまりよくないと思います。

 Pythonにはそういう問題はない。

理由3:self

 Pythonのselfはよく批判されるけど、なんだかんだでわかりやすい。

a.hoge("fuga")

 は

type(a).hoge(a, "fuga")

 と実質的に等価というルールがあることを理解すれば、後は不自然な点はなにもない。インスタンスの外側ではaとして見えているものは、内側ではselfとして見えていると考えれば良いということで、自然な発想でコードを書いていくことができる。

 selfを省略する言語はこれがないので、クラス変数とインスタンス変数の区別を付けるだけでも一苦労だし、ローカル変数まで混ざってくると本格的に訳がわからなくなる(から、EclipseJavaを書くとぜんぶ違う色で見せてくれる)。

理由4:普通にプログラミングしているだけでオブジェクト指向への理解が深まる

 Python初心者はlistをよく使う。そうするとappendやextendが出てくる。これはもうメソッドだ。

 関数の引数に渡したリストにappendするとリストの中身が変わるけど、intだと足し算しても変わらない。mutableなオブジェクトとimmutableなオブジェクトの違いを理解するだろうし、オブジェクトは変数に束縛されているだけというオブジェクト指向の基本的なモデル*2への理解も深まる。

 list.sort()とsorted(list)の違いを理解すれば、破壊的なメソッドには注意しないといけないこともわかる。

 だから、「オブジェクト指向の勉強のためにJavaを半年学んだ人」と「ただ単にプログラミングの勉強として半年Pythonを学んだ人」だと、オブジェクト指向に対する理解度は同程度か、ヘタしたら後者のほうが勝るくらいになっているかもしれない。

 まあ、これに関してはたぶんRubyも互角。

理由5:書いてて楽しい

 タイプ数も少ないし、なんかPythonはパズルみたいな技巧的な面があるし、書いてて楽しい。

向いていない理由も一応書く

 ダメな理由もなんか色々あるといえばあるような気もする。

罠が多い

 Pythonはシンプルなクセに罠が多い言語だと思う(「文字コード」とか「test.py作っただけでまともに動かない」とか「IndentationError」とか)。

 エラーメッセージも、わからないときはとことんわからないのが出るし。

 初心者のうちは、よくわからないところで詰む。そして初心者は自己解決できない。

 罠は回避するように教育していくとかで軽減は可能。ただ、本質的じゃない問題で初心者を悩ませるのもなんだかなぁという気がする。

そういうコンセプトの解説記事とかが少ない。あっても古い

 困るよね。

しょせんスクリプト言語

 カプセル化はないし、ポリモーフィズムの実現方法もすごく簡単(メソッド作るだけ!)。ので、Pythonやってから他の言語のオブジェクト指向を理解しようとすると、追加の学習コストがかかる。

独自の風習

 避けては通れないけど避けなかったところで得るものの少ないデコレータとか、

 初心者を惑わす内包表記とかジェネレータとか、

 やればやるほど実感するtuple周りのキモさとか*3

 これどうなんだ、と思う側面はたくさんあります。

windowsとそんなに相性がよくない

 最近はマシにはなりましたが、まだまだハマると思います。linux環境でやれとなるといきなり敷居が高くなります。

でもまあ、

 なんだかんだで学習コストの低さ、とっつきやすさでは、総合的には初心者向けのわかりやすい言語と言っても別に構わないくらいだとは思うよ(震え声)。

まとめ

 Pythonオブジェクト指向はわかりやすいよね、最初からこれで教えてもらえたらなぁ。Python良いよね! って気持ちの記事です。

 特に内容に責任は持たないが、意見等はご自由にどうぞ。

*1:「そんなのIDEが補完してくれるから良いんだよ!」という意見が当然あると思うが、それをやると馬鹿の一つ覚えのようにIDEの補完と修正任せでコードを書こうとする奴が続出するのでダメだ

*2:異論はあるだろうけど

*3:tupleは丸括弧によって作られるのではない、カンマによって作られるのである