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

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

私は自分のクラスを効率化しようとしており、同じスタイルでいくつかの機能を導入しました。フライウェイトデザインパターン

__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

なぜ?

ベストアンサー1

__new__新しいインスタンスの作成を制御する必要がある場合に使用します。

__init__新しいインスタンスの初期化を制御する必要がある場合に使用します。

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

対照的に、__init__は何も返しません。インスタンスが作成された後にそれを初期化する役割のみを果たします。

一般に、__new__str、int、unicode、tuple などの不変型をサブクラス化していない限り、オーバーライドする必要はありません。

2008年4月の投稿より:__new__vs. はいつ使うのですか__init__?mail.python.org で。

あなたがしようとしていることは、通常、工場そして、それが最善の方法です。 を使用することは__new__良いクリーンな解決策ではないので、ファクトリの使用を検討してください。 良い例を以下に示します。ActiveState のレシピ

おすすめ記事