質問

どんな方法を理解しています __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__ 不変のタイプをサブクラス化していない限り。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top