Python:__init__の代わりに常に__new__を使用しますか?
-
01-10-2019 - |
質問
どんな方法を理解しています __init__
と __new__
仕事。何かがあるのだろうか __init__
それをすることができます __new__
できませんか?
つまり、の使用ができます __init__
次のパターンに置き換えられます。
class MySubclass(object):
def __new__(cls, *args, **kwargs):
self = super(MySubclass, cls).__new__(cls, *args, **kwargs)
// Do __init__ stuff here
return self
Python OOのこの側面を私の頭の中でよりよくフィットさせたいので、私は尋ねています。
解決 2
1つの考えられる答え Guidoの投稿 (ありがとう @fraca7):
たとえば、ピクルスモジュールでは、
__new__
安全でないオブジェクトの場合にインスタンスを作成するために使用されます。この場合、インスタンスは作成されますが、__init__
メソッドは呼び出されません。
他の同様の答えはありますか?
私はこの答えを私自身の質問に「はい」として受け入れています:
何かがあるのだろうか
__init__
それをすることができます__new__
できませんか?
はい、とは異なります __new__
, 、あなたが入れた行動 __init__
抑制プロセス中にメソッドは実行されません。 __new__
この区別をすることはできません。
他のヒント
したがって、クラスのクラスは通常です type
, 、そしてあなたが電話するとき Class()
__call__()
メソッドオン Class
クラスはそれを処理します。私は信じている type.__call__()
このように多かれ少なかれ実装されています:
def __call__(cls, *args, **kwargs):
# should do the same thing as type.__call__
obj = cls.__new__(cls, *args, **kwargs)
if isinstance(obj, cls):
obj.__init__(*args, **kwargs)
return obj
あなたの質問への直接的な答えはノーです、 __init__()
できることができます(指定されたインスタンスを変更 /「初期化」)は、 __new__()
できることを実行できます(必要なオブジェクトを作成または選択し、オブジェクトが返される前に必要なオブジェクトに何でも実行します)。
ただし、両方の使用方法を使用すると便利です。の用法 __init__()
よりシンプルです(何も作成する必要はありません、何も返す必要はありません)、そして私は常に使用するのはベストプラクティスだと思います __init__()
使用する特定の理由がない限り __new__()
.
まあ、探しています __new__ vs __init__
Googleで私に見せてくれました これ.
短い話、 __new__
新しいオブジェクトインスタンスを返します __init__
何も返さず、クラスメンバーを初期化するだけです。
編集:実際にあなたの質問に答えるには、決してオーバーライドする必要はありません __new__
不変のタイプをサブクラス化していない限り。