Blow Up by Black Swan

Pythonークラス①(オブジェクト指向)

今回は、Pythonのクラスについて投稿しようと思います。といっても、プログラミングを知り尽くした人が初学者向けにわかりやすく書いた記事という立ち位置ではなく、初学者が独学で学び、腹落ちしたことを備忘録がてら書くことと、それで誰か一人くらいには参考になるんじゃないか、くらいの立ち位置で書いています。ということで、今後さらに知識がついていったら、修正や追記、改訂はするかもしれません。(そこまで大仰なことは書いてないですが…)ちなみに、私はMacBookとanacondaを使って、Pythonを学習しています。

クラス文を学ぶ理由

今回、Pythonのクラスを学習するきっかけになったのは、下の記事です。

最近話題のブロックチェーンを自分で作ってみようというQiitaの記事で、私も前から仮想通貨に興味があったので、この記事を見て作ってみようと思いました。ただ、今までPythonは基本的な部分は学習してはきたものの、クラスの学習は実はしていなかったので、この機会に学習することにしました。ちなみにこの後は、サードライブラリのflaskなど、この記事に書いてあって、自分の知らないことを学習していく予定です。ちなみにちなみにですが、私がPythonの学習に使った本は、次の2冊です。2冊目の方が練習問題付きで私は好きです。

  1. みんなのPython 第4版
  2. 退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング

オブジェクト指向についての私なりの理解

まずは、クラスの根底概念になるオブジェクト指向の私なりの理解について書こうと思います。細かいところは、まだわからないので、自分なりの概念的理解に終始しています。

オブジェクトとは

まず、「オブジェクト」とは何かというと、単純に「固有の振る舞いと性質を持つもの」と言えます。この「固有の振る舞いと性質」は説明する人によって言い方が違う印象があります。性質を属性と言ったりしますが、大体は行動と状態くらいの発想で良いと思います。Pythonでいえば、振る舞いがメソッド、状態がアトリビュートくらいの関係づけが理解しやすいと思いますが、色々なサイトや本を見て悩ましいのが、使っている言葉がバラバラだということだと思います。

私もそうですが、仕組みやなんか以前に言葉がわからない、これがプログラミングなどのITの勉強するときの大きな障壁になっていると思います。ここら辺は、もうひたすらググるしかないと思います。話が脱線しましたが、このオブジェクトが具体化したものが「インスタンス」、同じようなオブジェクトの集まりが「クラス」です(同類のオブジェクトを抽象化したのものともいえると思います)。

一方で、似たようなオブジェクトを集めた(抽象化した)ものが「クラス」ということは、逆からいうと「クラス」は「オブジェクト」の性質や機能などを記したものとも言えます。だから、「クラス」は「設計図」とも言えます。「クラス」「オブジェクト」「インスタンス」の3つの言葉の整理すると、「クラス」は「設計図」、そこから生み出された具体的なものが「インスタンス」、オブジェクトは漠然とした対象だという認識で良いと思います。

「クラス(設計図)」
↓
「インスタンス」=「オブジェクト」

Pythonでは、クラスから作られたものを「インスタンス」という(習わしになっている)ので、「クラス(設計図)」ー「インスタンス(具体的なもの)」という対比で把握すれば、わかりやすいと思います。そして、オブジェクトは漠然とした「対象」だと書きましたが、実際にオブジェクト指向を説明する記事の多くで、英語のobjectの意味に触れますが、その意味の中で「対象」や「もの」という訳に触れています。

この漠然とした「対象」という意味から、インスタンスだけでなく、クラスについてもオブジェクト(対象やもの)ということができ、「全てがオブジェクトである」とい言葉が出てくるのだと思います。

オブジェクト指向の特徴

次に、よく触れられるオブジェクト指向の特徴についての私なりの理解を書きたいと思います。

  • 継承
  • カプセル化
  • ポリモーフィズム

継承

継承は単純にあるクラスが他のクラスの特徴を引き継ぐこと、またはその関係性のことを言います。親子で例えると、母親と目が似てるとか、衝動買いしやすい性格が似ているとかそのようなイメージです。私は、母親の特徴の一部分を引き継いでいる、つまり継承しているということです。

カプセル化

勝手に違う特性や性質を植えつけられないよう、内部構造を隠しておくことです。けれども、求められたことに対しては、しっかり返事をする、そんなイメージです。

ポリモーフィズム

あるメソッドや機能が、いろんなオブジェクトで使えるということですPythonで言えば、文字列(str)型でも整数(int)型でも両方+(プラス)演算子が使えたり、文字列(str)型とリスト型で両方ともjoinメソッドが使えたり、そういったことです。

参考サイト

  1. ITmedia「5分で絶対に分かるオブジェクト指向 (5/6)」
  2. オブジェクト指向がわからない! そんなあなたの脳味噌をオブジェクト脳にする準備体操
  3. Pythonのオブジェクトとクラスのビジュアルガイド – 全てがオブジェクトであるということ

次回に続きます。