Pythonの__init__とは?クラスを理解する第一歩!

こんにちは。ゆうせいです。
Pythonのクラスを学び始めると、ほぼ必ず登場するのが__init__
という名前のついたメソッドです。
「なんかアンダーバーが2個ずつ付いてて、ちょっとこわい…」
「そもそもこれは何のためにあるの?」
そんな疑問を持ったことはありませんか?
今回は、Pythonの__init__
について、超やさしく、でもしっかりと解説していきます!
__init__
は「初期化メソッド」
一言で言うと…
__init__
は、クラスからインスタンスを作るときに最初に実行される特別なメソッドです。
Pythonではこのように使います。
class Person:
def __init__(self, name):
self.name = name
p = Person("ゆうせい")
print(p.name) # ゆうせいと表示される
__init__
の役割は?
- インスタンス変数(例:
self.name
)に値をセットする - オブジェクトが作られると同時に自動で呼び出される
つまり、「インスタンスが生まれるときの初期設定係」です!
数学で言えば「初期条件」のようなもの
例えば、物理でボールを投げるときに「初速度」や「角度」を決めますよね?__init__
はそれと同じで、「インスタンスがどんな状態でスタートするか」を設定するんです。
なぜ__init__
って名前なの?変えちゃだめ?
これはPythonが特別に決めた名前です。
「ダブルアンダースコア」で囲まれたこういう名前をマジックメソッド(特殊メソッド)と呼びます。
変えちゃうと、Pythonが自動で呼んでくれなくなります。
__init__
を使わないとどうなる?
__init__
がない場合
class Person:
pass
p = Person() # エラーは出ない
これは動きますが、属性(たとえば名前)を持たせることができません。
手動で設定するのは大変!
p.name = "ゆうせい"
毎回こう書かないといけないのは面倒ですよね。__init__
を使えば、スッキリ安全に設定できます。
よくある疑問に答えます!
__init__
の中のself
ってなに?
self
は今まさに作られているインスタンスそのものです。
「このインスタンスに対して
name
という属性を付けるよ!」
という意味になります。
はい、そうです!
Pythonの__init__
メソッドは、**コンストラクタ(constructor)**と呼ばれるものです。
コンストラクタってなに?
一言で言うと…
オブジェクト(インスタンス)が作られるときに最初に実行される特別な処理のことを、プログラミングの世界ではコンストラクタと呼びます。
たとえばJavaではこんなふうに書きます:
public class Person {
String name;
public Person(String name) {
this.name = name;
}
}
このPerson(String name)
の部分がコンストラクタです。
Pythonでは__init__
がコンストラクタ!
PythonにはJavaのような名前のコンストラクタはありませんが、その代わりに__init__
メソッドが使われます。
class Person:
def __init__(self, name):
self.name = name
このように、クラスからインスタンスを作るときに自動で呼ばれます。
ちょっとだけ違う点もある?
ここで少し専門的な話になりますが、実はPythonの本当の「コンストラクタ」は__new__
という別のメソッドなんです。
__new__
と__init__
の違い
メソッド名 | タイミング | 役割 |
---|---|---|
__new__ | インスタンスを「作る」とき | メモリ確保・インスタンス生成 |
__init__ | インスタンスを「初期化」するとき | 値をセットするなどの準備 |
でも、通常のクラス設計では__init__
だけを使えばOKです。__new__
は、イミュータブル(変更できない)な型を扱うときなど、特殊なケースで使います。
まとめと次のステップ!
__init__
はインスタンスが作られるときに実行される初期化メソッド- 属性の初期値を設定するのが主な役割
- 名前は変えず、必ず
__init__
で書く! self
は「そのインスタンス自身」を指す
次はぜひ、__init__
に複数の引数を渡してみてください!
また、Pythonの__str__
メソッド(文字列として表示するためのメソッド)や、継承での__init__
の上書きなども学んでいくと、クラスの理解がさらに深まりますよ。
「__str__
って何?」という方は、また気軽に聞いてくださいね!
セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク
投稿者プロフィール
