[解決済み] なぜ __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
なぜ?
解決方法は?
<ブロッククオート
使用方法
__new__
を制御する必要がある場合
新しいインスタンスを作成します。
使用方法
__init__
は、新しいインスタンスの初期化を制御する必要がある場合です。
__new__
は、インスタンス生成の最初のステップです。 最初に呼び出され
を返す役割を担っています。
のインスタンスを作成します。
それに対して
__init__
を初期化することだけを担当します。
インスタンスが作成された後です。
一般的には
オーバーライド
__new__
ただし
のような不変の型をサブクラス化しています。
str、int、unicode、tupleのいずれかです。
2008年4月の投稿より。
を使用する場合
__new__
vs.
__init__
?
をmail.python.orgに追加しました。
あなたがやろうとしていることは、通常は
工場
で、それが一番いい方法です。を使用します。
__new__
はきれいな解決策とは言えませんので、ファクトリーの利用を検討してください。以下はその良い例です。
ActiveState Fᴀᴄᴛᴀᴛᴇʀɴഫ レシピ
.
関連
-
Python jiabaライブラリの使用方法について説明
-
Python Pillow Image.save jpg画像圧縮問題
-
PythonでECDSAを実装する方法 知っていますか?
-
[解決済み】Django: ImproperlyConfigured: SECRET_KEY 設定は空であってはならない
-
[解決済み] __init__.py は何のためにあるのですか?
-
[解決済み] 割り当て後にリストが予期せず変更されました。その理由と防止策を教えてください。
-
[解決済み] Python 3で「1000000000000000 in range(1000000000000001)」はなぜ速いのですか?
-
[解決済み] なぜC++はPythonよりもstdinからの行の読み込みが遅いのですか?
-
[解決済み] なぜlist.join(string)ではなくstring.join(list)なのでしょうか?
-
[解決済み】なぜPythonはこのJSONデータをパースできないのですか?[終了] PythonがこのJSONデータをパースできないのはなぜですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
python string splicing.join()とsplitting.split()の説明
-
PythonはWordの読み書きの変更操作を実装している
-
[解決済み】TypeError: unhashable type: 'numpy.ndarray'.
-
[解決済み】Python regex AttributeError: 'NoneType' オブジェクトに 'group' 属性がない。
-
[解決済み】ilocが「IndexError: single positional indexer is out-of-bounds」を出す。
-
[解決済み】TypeError: re.findall()でバイトのようなオブジェクトに文字列パターンを使用することはできません。)
-
[解決済み] 'DataFrame' オブジェクトに 'sort' 属性がない
-
[解決済み】Python Error: "ValueError: need more than 1 value to unpack" (バリューエラー:解凍に1つ以上の値が必要です
-
[解決済み】ValueError: pickleプロトコルがサポートされていません。3、python2 pickleはpython3 pickleでダンプしたファイルを読み込むことができない?
-
[解決済み] Python (およびPython C API)。new__ と __init__ の比較