プログラミング自体が初めてで、最初の言語としてPythonを選んだ者です。
初学者だと、色んな壁がありますよね。
例えばクラスの概念。
みなさんはすんなり理解できましたか?
私はもれなく壁に激突した次第です。
特に問題集を見ていると「これはクラスなの?それとも別物?同じ文字列してるじゃん……」
ってのがよくあったんですよね。区別つかんて。ほんとに。
例えば、こういうコードです。
class Cookie:
def __init__(self, shape):
self.shape = shape
cookie = Cookie("星型")
print(cookie.shape)
……わけわからないですよね(私だけ……?)
たった数行なのに既に「???」ってなります。
cookie = Cookie("星型") を見たときに「左右同じ意味じゃないの、これ?」って混乱して。
「百歩譲って別物はわかった。でもどう区別するの?大文字小文字で区別??」ってなって。
self.shape = shape も「同じ名前が2回出てきてるじゃん、これ意味違うの?!」ってなって。
「みんなこんなのを簡単に理解してるんだ……(絶望)」となったわけです。
クラスを学ぶ前は x = 1 とか name = "田中" みたいに、= の左右は別々のものを書くのが当たり前だったので、同じ名前が左右に出てくると「あれ、これ変数の代入じゃないの?」って混乱するんですよね。前の知識が邪魔をするパターンです。
つまり、私が一番混乱していたのってクラスと変数の関係だったんですよね。
cookie ってクラスなの?変数なの?インスタンスなの?なんなの?って具合です。
この記事は、そのときの自分に向けて書きます。
「大文字か小文字か」は本質じゃない
もちろん書き分けてはいるんですが、それはPythonが強制しているわけじゃなくて、「読みやすくするための慣習」だったんです。
クラス名は頭文字を大文字にする、変数名は小文字にする、というのがPythonの世界での暗黙のルールになっているだけ。
「Cookie と cookie の違いは、大文字・小文字じゃない、だと……?」
大混乱です。
ではなにかというと……。
本当の違いは、「型紙なのか」「実体なのか」 だったのです。
クラス・インスタンス・変数――結局どう違うの?
クラスとインスタンスの説明だと、色んな例えがありますね。鯛焼きの鋳物とかがメジャーでしょうか。
この前KALDIで買ったクッキーを食べたら美味しかったので、今回はクッキーに例えてみます(?)
-
Cookie(クラス)→ クッキー型。「このクッキーはこうです」という設計図。 -
Cookie("星型")(インスタンス)→ その型で実際に焼いたクッキー1枚。 -
cookie(変数)→ そのクッキーに貼った名札。
cookie = Cookie("星型")
# ↑ ↑
# 名札(変数) 焼いたクッキー(インスタンス)
つまり cookie は変数です。名札がつながっている先にインスタンス(クッキー)があるイメージで、cookie を通じてインスタンスを操作できる、という関係です。
型紙は1つでも、何枚でも焼ける
クッキー型は1つあれば、そこから何枚でも焼けますよね。
クッキー型を使い捨てになんてしないはず。何枚も同じ形を焼くなら、1つ1つ成形してたら時間がかかるので、同じ型で量産すると思います。
クラスも同じで、1つの設計図から何個でもインスタンスを作れます。
cookie1 = Cookie("星型") # 1枚目のクッキーを「cookie1」と名付けた
cookie2 = Cookie("ハート型") # 2枚目のクッキーを「cookie2」と名付けた
cookie1 も cookie2 も、どちらも Cookie という同じ型紙から作ったインスタンスです。でも別々の名札をつけることで、それぞれ独立した存在として扱えます。
print(cookie1.shape) # → 星型
print(cookie2.shape) # → ハート型
同じ型紙から作っても、結果が混ざらずにちゃんと別々に出てきます。
なぜかというと、それぞれが自分専用の保存場所を持っているからです。かしこい!
cookie1 には「星型」、cookie2 には「ハート型」というデータがそれぞれの中に保存されていて、お互いに干渉しません。
「でもその保存場所ってどうやって作るの?」という疑問が出てきますよね。
それが self.shape = shape の話です。次の記事で詳しく説明します!
まとめ
| 疑問 | 答え |
|---|---|
Cookie と cookie の違いは? |
型紙(クラス)と名札(変数)。大文字小文字は慣習。 |
cookie はインスタンス?変数? |
変数。名札がつながっている先にインスタンスがある。 |
| 同じ型紙から作ったのに結果が違う理由は? | それぞれが自分専用の保存場所を持っているから。 |
まだまだ初学者なので、間違っているところがあればぜひご指摘いただけますと幸いです。
次の記事では、「その保存場所はどうやって作るのか」= self.shape = shape の左右の違いと、__init__ の正体に迫ります!