私が尋ねようとしている質問は、Pythonでの__new__と__init__の使用の複製のようです。、しかし、それにもかかわらず、との実際的な違いが正確に何であるかはまだ私にはわかりませ__new__
ん__init__
。
__new__
これはオブジェクトの作成用であり、オブジェクトの初期化用であると急いで言う前に__init__
、はっきりさせておきます。わかりました。 実際、私はC ++の経験があり、オブジェクトの割り当てと初期化を同様に分離する 新しい配置を使用しているため、この区別は非常に自然です。
Python C APIチュートリアルでは、次のように説明しています。
新しいメンバーは、そのタイプのオブジェクトを(初期化するのではなく)作成する責任があります。メソッドとしてPythonで公開されてい
__new__()
ます。... 新しいメソッドを実装する理由の1つは、インスタンス変数の初期値を保証することです。
だから、ええ-私は何をするのかわかります__new__
が、それにもかかわらず、Pythonでなぜそれが役立つのかまだわかりません。与えられた例は、__new__
「インスタンス変数の初期値を保証したい」場合に役立つかもしれないと言っています。まあ、それは正確に何__init__
をするのではないですか?
__new__
C APIチュートリアルでは、新しいタイプ(「Noddy」と呼ばれる)が作成され、タイプの関数が定義されている例が示されています。Noddyタイプには、という文字列メンバーが含まれておりfirst
、この文字列メンバーは次のように空の文字列に初期化されます。
static PyObject * Noddy_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
.....
self->first = PyString_FromString("");
if (self->first == NULL)
{
Py_DECREF(self);
return NULL;
}
.....
}
__new__
ここで定義されたメソッドがなければPyType_GenericNew
、すべてのインスタンス変数メンバーをNULLに初期化するだけのを使用する必要があることに注意してください。したがって、このメソッドの唯一の利点は__new__
、インスタンス変数がNULLではなく空の文字列として開始されることです。 しかし、インスタンス変数がデフォルト値に初期化されていることを確認する必要がある場合は、メソッドでそれを実行できたはずなので、これが便利なのはなぜですか?__init__