Pythonの「self」はなぜ必要?その理由と設計思想をわかりやすく解説!
こんにちは。ゆうせいです。
今回は、新人エンジニアの方がよく疑問に思うポイント――
「なぜPythonのコンストラクタ(__init__)にselfを明示的に書かないといけないの?」
というテーマについて、じっくり解説していきます。
もし「JavaやC++では書かなくてもいいのに、なぜPythonだけ?」と疑問に感じていたら、まさに今回の記事はピッタリです。
Pythonのselfってそもそも何?
selfは「自分自身のインスタンス」への参照
Pythonでは、クラスから生成されるそれぞれのオブジェクト(=インスタンス)が、自分自身にアクセスするためのキーワードとしてselfを使います。
たとえば、以下のようなコードを見たことがあるかもしれません。
class Dog:
def __init__(self, name):
self.name = name
ここでのself.name = nameは、「このインスタンスのname属性に、引数で渡されたnameを代入する」という意味になります。
つまり、selfがなければ、「どのインスタンスのことを指しているのか」が分からなくなってしまうのです。
なぜselfを明示的に書かせるのか?
他の言語との違いを比較してみよう
| 言語 | インスタンス自身の参照 | 書き方 |
|---|---|---|
| Python | self(明示的に書く) | self.name = name |
| Java | this(暗黙的に存在) | name = nameなど |
| C++ | this(暗黙的に存在) | this->name = name |
他の言語では、インスタンス自身を指す「this」が暗黙的に存在していて、明示的に書かなくても自動で使われています。
では、なぜPythonだけ明示的に書かせるのでしょうか?
設計者の考え:明示は暗黙に勝る
Pythonの生みの親、グイド・ヴァンロッサム(Guido van Rossum)は、以下のような思想を大切にしています。
「明示的は暗黙的に勝る(Explicit is better than implicit)」
これはPythonの設計哲学「Zen of Python」の中のひとつで、非常に重要な考え方です。
Pythonでは、「コードを読む人にもわかりやすくすること」を何より重視しています。selfを明示的に書くことで、「このメソッドはインスタンスの属性や振る舞いに関係している」と一目でわかるようになっているんですね。
例えで理解しよう:自己紹介するときの名前
たとえば、自己紹介をするとき。
- Aさん:「こんにちは、私はAです。」
- Bさん:「こんにちは。」
このとき、Bさんのように「私は誰です」と言わないと、聞いてる人は「誰?」となりますよね。
Pythonでは、Bさんのような書き方は避けましょうという立場です。
しっかり「私はAです(self.name = "A")」と書いてあげることで、読む人も迷わない親切なコードになります。
selfを省略できないことで得られるメリット
コードがシンプルで誤解が少ない
selfを明示することで、「これはローカル変数ではなく、インスタンスの属性だ」とすぐにわかります。- 将来、他人がコードを読むときにも混乱が少なくなります。
動的にメソッドを追加・差し替えしやすい
Pythonは柔軟なオブジェクト指向言語なので、実行時にメソッドや属性を変更することもできます。
そのため、どの関数がどのインスタンスに属しているかを明示しておくことは、実はとても重要なのです。
デメリットはあるの?
毎回書くのがちょっと面倒…
新人エンジニアにとっては、「なんで毎回self.って書かないといけないの…?」と感じるかもしれません。
たしかに、ちょっとしたメソッドでもselfを何回も書く必要があります。でも、それが可読性と柔軟性を優先するPythonらしさなんです。
数式で考えるselfの役割
数式風に表現すると:
- 通常の関数:
f(x) = x + 1(エックスたすいち) - インスタンスメソッド:
f(self, x) = self.x + x
つまり、selfはそのオブジェクトの中の状態(self.x)を使いたいときに必要になります。
今後の学習のポイント
- selfは「自分自身のインスタンス」へのアクセス手段であることをしっかり覚えましょう。
- Pythonでは「明示は暗黙に勝る」という設計思想があることを意識してください。
- クラスやオブジェクト指向の基礎を、Pythonを使って実践的に学んでみるのがおすすめです!
これからクラス設計や大きなプログラムを作るときに、selfのありがたみをどんどん実感できるはずですよ。
他にも「@classmethodと@staticmethodって何が違うの?」といった疑問が出てきたら、ぜひまた読んでくださいね。
セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク
投稿者プロフィール
- 代表取締役
-
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。
最新の投稿
山崎講師2025年11月2日Pythonの「なるほど!」と思えるユニークな機能④
山崎講師2025年11月2日Pythonの「なるほど!」と思えるユニークな機能③
山崎講師2025年11月2日Pythonの「なるほど!」と思えるユニークな機能②
山崎講師2025年11月2日Pythonの「なるほど!」と思えるユニークな機能①