__init__() と __new__() のシーケンスを理解する
Python では、__new__() メソッドと __init__() メソッドが重要な役割を果たしますインスタンス作成プロセスで。しかし、多くの開発者は、なぜ __init__() が常に __new__() の後に呼び出されるのか疑問に思っています。
__new__() の目的
__new__() は、新しいインスタンス。インスタンスの割り当てを初期化し、インスタンス自体を返します。基本的に、__new__() は、新しいインスタンスを作成するか、既存のインスタンスを再利用するかを決定します。
__init__() の目的
__init__() は、オブジェクトの初期化に使用されます。インスタンスの属性を設定し、必要なセットアップ コードを実行します。 __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 サイトの他の関連記事を参照してください。