私は自分のクラスを効率化しようとしており、同じスタイルでいくつかの機能を導入しました。フライウェイトデザインパターン。
__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 のレシピ。