ホームページ >バックエンド開発 >Python チュートリアル >Python の `__init__()` が常に `__new__()` の後に呼び出されるのはなぜですか?

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

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-18 17:36:10582ブラウズ

Why is Python's `__init__()` Always Called After `__new__()`?

__init__() と __new__() のシーケンスを理解する

Python では、__new__() メソッドと __init__() メソッドが重要な役割を果たしますインスタンス作成プロセスで。しかし、多くの開発者は、なぜ __init__() が常に __new__() の後に呼び出されるのか疑問に思っています。

__new__() の目的

__new__() は、新しいインスタンス。インスタンスの割り当てを初期化し、インスタンス自体を返します。基本的に、__new__() は、新しいインスタンスを作成するか、既存のインスタンスを再利用するかを決定します。

__init__() の目的

__init__() は、オブジェクトの初期化に使用されます。インスタンスの属性を設定し、必要なセットアップ コードを実行します。 __init__() はオブジェクトの状態を初期化することが主な目的であるため、何も返しません。

インスタンス作成のシーケンス

インスタンス作成のシーケンスは常に次のとおりです。

  1. __new__() が最初に呼び出され、既存のオブジェクトが割り当てられ、場合によっては返されます。
  2. __new__() が新しいインスタンスを返す場合、__init__() が呼び出されてインスタンスを初期化します。

次の例は、__new__() がインスタンスを制御する方法を示しています。作成:

class A(object):
    _dict = dict()

    def __new__(cls):
        if 'key' in A._dict:
            print("EXISTS")
            return A._dict['key']
        else:
            print("NEW")
            return super(A, cls).__new__(cls)

    def __init__(self):
        print("INIT")
        A._dict['key'] = self
        print("")

a1 = A()
a2 = A()
a3 = A()

出力:

NEW
INIT

EXISTS
INIT

EXISTS
INIT

ご覧のとおり、__new__() はまずインスタンスが _dict に既に存在するかどうかを確認します。そうであれば、その既存のインスタンスを返します。それ以外の場合は、新しいインスタンスを作成して返します。次に、__init__() が呼び出されて各インスタンスが初期化されます。

__new__() を使用する代替方法

ほとんどの場合、__new__() を使用して独自のフライウェイト デザイン パターンを実装します。はお勧めできません。代わりに、ファクトリ クラスまたはオブジェクト プールを使用してインスタンスの作成と再利用を管理することを検討してください。

以上がPython の `__init__()` が常に `__new__()` の後に呼び出されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。