29

__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 のこの側面を私の頭の中でよりよく適合させたいので、私は尋ねています。

4

3 に答える 3

23

したがって、クラスのクラスは通常であり、 のクラスでメソッドtypeを呼び出すと、それClass()が処理されます。多かれ少なかれ次のように実装されていると思います:__call__()Classtype.__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__()

于 2010-06-28T14:59:06.930 に答える
4

guidoの投稿からの1つの可能な答え(@ fraca7に感謝):

たとえば、pickleモジュールで__new__は、オブジェクトのシリアル化を解除するときにインスタンスを作成するために使用されます。この場合、インスタンスは作成されますが、__init__メソッドは呼び出されません。

他の同様の答えはありますか?


私はこの答えを私自身の質問に対する「はい」として受け入れています。

__init__できないことがあるのか​​しら__new__

はい、とは異なり__new__、メソッドに入力したアクションは__init__、ピクリング解除プロセス中に実行されません。 __new__この区別はできません。

于 2010-06-28T13:50:05.597 に答える
2

さて、__new__ vs __init__Googleで検索すると、これが表示されまし

簡単に言うと__new__、新しいオブジェクト インスタンスを__init__返しますが、何も返さず、クラス メンバーを初期化するだけです。

__new__編集:実際に質問に答えるには、不変の型をサブクラス化していない限り、オーバーライドする必要はありません。

于 2010-06-28T10:12:15.930 に答える