前の記事では、クラス・インスタンス・変数の関係を整理しました。
-
Cookie(クラス)→ クッキー型。設計図。 -
Cookie("星型")(インスタンス)→ 実際に焼いたクッキー1枚。 -
cookie(変数)→ そのクッキーに貼った名札。
そして最後に「それぞれが自分専用の保存場所を持っているから、中身が混ざらない」という話をしました。
じゃあその保存場所ってどうやって作るの? というのが今回のテーマです。
答えは self.shape = shape の中にあります。
self.shape = shape の左右は何が違うの?
ここにも左右で同じ文字列が………(苦手意識)
正体はというと。
self.shape = shape
# 左:このクッキー専用の保存場所
# 右:外から渡されたデータ
こうなります。
えぇ、つまりどういうこと??と思いますよね。私も思います。
ですので、少し深掘りして考えたいと思います。
繰り返しになりますが、右の shape は、「外から渡されたデータ」です。
そして左の self.shape は、「このクッキーが自分専用で持つデータ」です。
cookie = Cookie("星型")
# ↑ この "星型" が shape として受け取られる
self は「自分自身(このインスタンス)」を指す言葉で、.shape はそのデータにつけた名前です。
(self がなぜここに出てくるのか、詳しくは別の機会に……!)
- 右側の
shapeは、その場限りの「引数(ひきすう)」 - 左側の
self.shapeは、ずっと保持される「インスタンス変数」
【イメージ訳】「いま届いた材料(shape)を、自分専用の倉庫(self.shape)に保管せよ!」
つまり1行でやっていることは、「渡された形を、このクッキー自身のデータとして保存する」 それだけです。
引数名(右側)は自由につけられますが、self.shape の shape という名前はあとで cookie.shape として読み出すときと合わせる必要があります。
>引数名(右側)は自由につけられる
これを証明するために、試しに引数名を変えてみます。
class Cookie:
def __init__(self, mold): # 引数名を mold にした
self.shape = mold # self.shape の名前は変えていない
cookie = Cookie("星型")
print(cookie.shape) # → 星型
ちゃんと動いてくれます!
cookie1 と cookie2 は同じ型紙から生まれても、それぞれ自分専用のデータを持っているので、中身が混ざることはありません。
__init__ って何?
ところで、さっきから self.shape = shape という処理が __init__ の中に書かれていましたね。この __init__ って何者なのでしょう。
初見だとびっくりしませんか、ちなみに。私はしました。
_init_ならまだわかるけど、アンダースコアが2本連なっているんですよ、左右両方に。
何者だよと思いませんか?
これ、Pythonの世界では「ダンダー(dunder)」と呼ばれているそうです。double underscoreの略です。__init__ は「ダンダーイニット」。
すごい、どこかの呪文みたいな名前です。
class Cookie:
def __init__(self, shape):
self.shape = shape
やや話が逸れましたが、__init__ は、「インスタンスが生まれた瞬間に自動で走る初期設定の処理」 です。
Cookie("星型") と書いた瞬間、Pythonは勝手に __init__ を呼び出します。
焼きたてのクッキーはまだ真っさらな状態なので、そこに名札をつけたりする初期作業を自動でやってくれる係、というイメージです。頼りになります。
cookie.shape はどうやって読んでるの?
print(cookie.shape) # → 星型
cookie.shape は「cookie という名札のついたクッキーの、shape データを取り出す」という意味です。
ドット(.)は「〜の中の〜」と読めば大体あってます。
全部つなげて読んでみる
最初に見たコードに戻ってみましょう。
# 1. クッキーの型紙(設計図)を用意
class Cookie:
def __init__(self, shape):
# 2. 焼いた瞬間に、「渡されたデータ」を「自分専用の保存場所」に入れる
self.shape = shape
# 3. 型紙を使って、実際にクッキーを焼く(インスタンス化)
# 焼いたクッキーに「cookie」という名札(変数名)をつける
cookie = Cookie("星型")
# 4. 名札がついたクッキーの「中身(データ)」を取り出す
print(cookie.shape) # → 星型
最初はまったく読めなかったこのコード、今はこう読めます。
-
Cookieという型紙を定義する -
Cookie("星型")でクッキーを焼く(このとき__init__が動いて形を保存) - 焼いたクッキーに
cookieという名札をつける -
cookie.shapeでそのクッキーの形を取り出す
まとめ
| 疑問 | 答え |
|---|---|
__init__ は何? |
インスタンスが生まれた瞬間に走る初期設定 |
self.shape と shape の違いは? |
左はこのインスタンス専用のデータ、右は渡されたデータ |
cookie.shape は何をしてる? |
そのクッキーの shape データを取り出している |
次の記事では、今回と繋がる「同じ名前が2回出てくる」パターンをさらに深掘りします。
calendar.calendar(2026) などは、初学者が必ず「えっ、何このミスプリントみたいなコード?」と思う部分です。
次回はこのような、「住所(モジュール)」と「名前(関数)」がたまたま同じせいで二度見してしまうパターンを攻略します!
※予定※
calendar.calendar(2026) # calendarが2回!?
json.dump(fp=fp, obj=data) # fpが2回!?