1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

#0100(2025/04/10)クラスの初期化メソッド

Posted at

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__

これらを使い分けることで、より柔軟で明確なクラス設計が可能になります。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?