__init__()が常に__new__()の後に呼び出される理由
Pythonのクラスをインスタンス化するとき、まず__new__()メソッドが呼び出されます。__new__()は新しいインスタンスを作成し、そのインスタンスを返します。その後、作成されたインスタンスに対して__init__()メソッドが呼び出され、初期化処理が行われます。この順序はPythonのオブジェクト指向プログラミングの仕組みに基づいており、__new__()がインスタンスを作成し、__init__()が初期化を行うため、__init__()は常に__new__()の後に呼び出されるのです。
具体的な例と出力
以下に具体的な例を示します。Carクラスを定義し、__new__()と__init__()メソッドを実装して、それぞれの呼び出し順序と出力を確認します。
class Car:
def __new__(cls):
print("__new__() is called")
instance = super(Car, cls).__new__(cls)
return instance
def __init__(self):
print("__init__() is called")
self.brand = "Toyota"
car = Car()
上記のコードを実行すると、以下の出力が得られます。
__new__() is called __init__() is called
別の例
もう1つ例を示します。Personクラスを定義し、__new__()と__init__()メソッドを使用して、順序と出力を確認します。
class Person:
def __new__(cls):
print("__new__() is called")
instance = super(Person, cls).__new__(cls)
return instance
def __init__(self, name):
print("__init__() is called")
self.name = name
person = Person("Alice")
上記のコードを実行すると、以下の出力が得られます。
__new__() is called __init__() is called
以上の例からわかるように、__new__()がインスタンスを作成し、__init__()が初期化を行うため、常に__new__()の後に__init__()が呼び出されることが確認できます。
__init__()メソッドは、Pythonのクラス定義内でオブジェクトが作成された後に呼び出される特殊なメソッドです。一方、__new__()メソッドは、新しいオブジェクトのインスタンスを作成するための特殊メソッドです。Pythonでは、オブジェクトの生成プロセスは__new__()メソッドによって始まり、その後に__init__()メソッドが呼び出されます。この順序は、オブジェクトの初期化が適切に行われるために重要です。つまり、__init__()メソッドは、オブジェクトが作成された後にその状態を初期化するために使用されるため、__new__()メソッドの後に呼び出される必要があります。
