Python クラスの初期化メソッド
Pythonのクラスでは、インスタンスやクラスを初期化・設定するための特殊メソッドがいくつか用意されています。代表的な4つのメソッドと、他の関連する初期化メソッドを詳しく解説します。
1. __init__
(インスタンスの初期化)
特徴
- インスタンスが生成された後に呼び出される。
- 主にインスタンス変数の初期化や設定に利用する。
使用例
class MyClass:
def __init__(self, value):
self.value = value
obj = MyClass(10)
print(obj.value) # 出力: 10
2. __new__
(インスタンスの生成)
特徴
- インスタンスが生成される直前に呼び出される。
- クラスのインスタンス生成を制御したいときに利用。
- 必ず生成したインスタンスを返す必要がある。
使用例
class Singleton:
_instance = None
def __new__(cls):
if cls._instance is None:
cls._instance = super().__new__(cls)
return cls._instance
obj1 = Singleton()
obj2 = Singleton()
print(obj1 is obj2) # 出力: True
3. __post_init__
(データクラスの初期化後処理)
特徴
- データクラス(
@dataclass
)のインスタンス生成後に自動で呼ばれる。 -
__init__
メソッドで設定した後の追加処理を記述したい場合に使う。
使用例
from dataclasses import dataclass
@dataclass
class User:
name: str
age: int
def __post_init__(self):
if self.age < 0:
raise ValueError("Age must be positive")
user = User("Alice", 30)
print(user) # 出力: User(name='Alice', age=30)
4. __init_subclass__
(サブクラスの初期化)
特徴
- クラスがサブクラス化された時に自動で呼び出される。
- サブクラスが生成されるたびに共通の処理を行いたい時に便利。
使用例
class Base:
def __init_subclass__(cls, **kwargs):
super().__init_subclass__(**kwargs)
print(f"Subclass initialized: {cls.__name__}")
class SubClass(Base):
pass
# 出力: Subclass initialized: SubClass
その他の初期化に関連する特殊メソッド
5. __prepare__
(クラス定義時の名前空間準備)
- メタクラスでクラス作成時に呼ばれる。
- クラス定義内の名前空間(辞書)を準備・初期化する。
使用例
class Meta(type):
@classmethod
def __prepare__(metacls, name, bases):
print(f"Preparing namespace for {name}")
return dict()
class MyClass(metaclass=Meta):
pass
# 出力: Preparing namespace for MyClass
6. __class_init__
(非公式)
- Python標準には存在しないが、一部のフレームワークなどが特別に用意していることがある。
- 主にクラスが初めて使用される際に初期化処理を実施するケース。
各メソッドの呼び出し順序まとめ
インスタンス生成時:
__new__ → __init__ → (__post_init__ ※データクラスのみ)
サブクラス生成時:
__prepare__ (メタクラス) → __init_subclass__
これらを使い分けることで、より柔軟で明確なクラス設計が可能になります。