1. ホーム
  2. python

[解決済み] なぜ __init__() は常に __new__() の後に呼び出されるのですか?

2022-03-15 18:28:14

質問

あるクラスを合理化しようとして、いくつかの機能を同じスタイルで導入したところ フライウェイトデザインパターン .

しかし、少し戸惑うのは、なぜ __init__ の後に必ず呼び出されます。 __new__ . これは想定外でした。なぜこのようなことが起こるのか、また、この機能を別の方法で実装するにはどうしたらよいのか、どなたか教えていただけませんか?(実装を __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__ を制御する必要がある場合 新しいインスタンスを作成します。

<ブロッククオート

使用方法 __init__ は、新しいインスタンスの初期化を制御する必要がある場合です。

__new__ は、インスタンス生成の最初のステップです。 最初に呼び出され を返す役割を担っています。 のインスタンスを作成します。

<ブロッククオート

それに対して __init__ を初期化することだけを担当します。 インスタンスが作成された後です。

一般的には オーバーライド __new__ ただし のような不変の型をサブクラス化しています。 str、int、unicode、tupleのいずれかです。

2008年4月の投稿より。 を使用する場合 __new__ vs. __init__ ? をmail.python.orgに追加しました。

あなたがやろうとしていることは、通常は 工場 で、それが一番いい方法です。を使用します。 __new__ はきれいな解決策とは言えませんので、ファクトリーの利用を検討してください。以下はその良い例です。 ActiveState Fᴀᴄᴛᴀᴛᴇʀɴഫ レシピ .