概要

思えば、 Python を始めて、ちょこちょこ手遊び2年が経過した。

記念に2年前の自分へクラスの解説を書いてみる。あの頃はとりあえずドットインストールのpython講座動画で入門したのだよな。振り返ってみようとドットインストールサイトに行ってみたら、 Python 講座が有料になっていた。残念。

 

今きみが持っている疑問

さてきみは、足し算の書き方や関数の書き方、リストやディクショナリは理解できたのに、このクラスとかいう単元へ移った途端にトツゼン理解不能になり困惑しているところだと思う。スクリプト書くにあたっては直近必要ないように思えるし理解しなくても別にいっかーと思いつつも、ネットに載ってるサンプルスクリプトではやたらめったらクラスが使われているのでますます困惑を極めていることだろう。

  • 何なのクラスって……?
  • なんでこんなに使われてるの……?

この疑問を軸にして解説してみよう。

クラスってのはディクショナリみたいなものだ

下の例を見てみれば、ディクショナリを定義して値を取り出すのも、クラスを定義して値を取り出すのも似たようなものだとわかるだろう?

# ディクショナリ
dic = {
    'a': 'A',
    'b': 'B',
}
print(dic['a'])  # 'A'が取り出せる。

# クラス
class Klass:
    a = 'A'
    b = 'B'
print(Klass.a)  # 'A'が取り出せる。

うん? 似てるけれど、ディクショナリではキーを文字列 ('a') で指定しているのに対し、クラスのほうは変数 (a) で指定しているから違うんじゃないかって? ならばこう書いてやろう。

Klass_dic = Klass.__dict__
print(Klass_dic['a'])  # 'A'が取り出せる。

__dict__ はクラスの中身をディクショナリ形式にしてくれる。ってことは、クラスはディクショナリに変換可能なものなんだ。

サンプルスクリプトでやたらクラスが使われているのはそれが便利だからだ

必要だからではない。

きみの2年後であるぼくがスクリプトにクラスを使うのは、パッケージ化がしたいときだ。今のきみでも、スクリプトを適当に書くより関数にまとめたほうが良いカモっていう感覚はなんとなくもっているだろう?

  • 使い回しがきくようになるし、
  • 変数の有効範囲が他と隔絶するから他のトコで使う変数と名前衝突するのを防げるもんね。
  • あと、まとまってる感じがなんか嬉しいだろう? きみはそういう性格だ。

クラスを使うのはそれと同じ理由だ。きみが小さな計算スクリプトをさっくりまとめたくて関数を作るのと同じテンションで、ぼくはもうすこし大規模な計算や、複数の関数をさっくりまとめたくてクラスを作るのだ。

サンプルスクリプトでやたらクラスが使われているのは、いま述べたように、「公開するんだからグローバル・スコープにだらだら書くんじゃなくてちゃんとまとめて書くか」という理由によるものが半分だ。もう半分は、そのサンプルを書いた人もきみと同じようによくわからんままにコピペで書いているだけだ。

 

幕間

きみはこれから解説記事で「クラスが設計図でインスタンスがロボットやクルマ」系の例え話をよく目にすることになると思うが、それはきみの役には立たないので見なくてよい。きみはヘンに例え話をされるより、実際の仕様で説明されたほうが頭に入る。

 

じゃあインスタンスは?

インスタンスもディクショナリだと思ってイイよ

てか Python スクリプトなんてすべてがディクショナリみたいなもんなのだ。数ヶ月後きみは試行錯誤する中でその片鱗に気がつくことになる(Python 変数もどき自動作成)し、さらにその半年後、オライリーという教典を読んでリファレンスという概念を知りその理解が正しかったことを知ることになる(Mark Lutz『初めてのPython』)。a,b,cというクラス変数をもったクラスと、a,b,cというキーをもったディクショナリがおんなじようなもんであるように、a,b,cというクラス変数をもったインスタンスもおんなじようなもんだ。

class Klass:
    a = 'A'
    b = 'B'
    c = 'C'

klass = Klass()
print(klass.a)  # 'A'って表示される