なぜ__init__()は常に__new__()の後に呼び出されるのですか?

PYTHON3 チュートリアル

__init__()が常に__new__()の後に呼び出される理由

Pythonのクラスをインスタンス化するとき、まず__new__()メソッドが呼び出されます。__new__()は新しいインスタンスを作成し、そのインスタンスを返します。その後、作成されたインスタンスに対して__init__()メソッドが呼び出され、初期化処理が行われます。この順序はPythonのオブジェクト指向プログラミングの仕組みに基づいており、__new__()がインスタンスを作成し、__init__()が初期化を行うため、__init__()は常に__new__()の後に呼び出されるのです。

具体的な例と出力

以下に具体的な例を示します。Carクラスを定義し、__new__()と__init__()メソッドを実装して、それぞれの呼び出し順序と出力を確認します。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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()
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()
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()

上記のコードを実行すると、以下の出力が得られます。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
__new__() is called
__init__() is called
__new__() is called __init__() is called
__new__() is called
__init__() is called

別の例

もう1つ例を示します。Personクラスを定義し、__new__()と__init__()メソッドを使用して、順序と出力を確認します。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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")
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")
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")

上記のコードを実行すると、以下の出力が得られます。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
__new__() is called
__init__() is called
__new__() is called __init__() is called
__new__() is called
__init__() is called

以上の例からわかるように、__new__()がインスタンスを作成し、__init__()が初期化を行うため、常に__new__()の後に__init__()が呼び出されることが確認できます。

__init__()メソッドは、Pythonのクラス定義内でオブジェクトが作成された後に呼び出される特殊なメソッドです。一方、__new__()メソッドは、新しいオブジェクトのインスタンスを作成するための特殊メソッドです。Pythonでは、オブジェクトの生成プロセスは__new__()メソッドによって始まり、その後に__init__()メソッドが呼び出されます。この順序は、オブジェクトの初期化が適切に行われるために重要です。つまり、__init__()メソッドは、オブジェクトが作成された後にその状態を初期化するために使用されるため、__new__()メソッドの後に呼び出される必要があります。

購読
通知


0 Comments
Inline Feedbacks
View all comments