質問は約Python's use of __new__ and __init__?と重複しているようですが、実際には__new__
と__init__
の実際の違いは何であるかは不明です。Python(とPython C API):__new__と__init__
__new__
はオブジェクトを作成するためのもので、__init__
はオブジェクトを初期化するためのものです。私はそれを知っています。実際には、私はplacement newというC++での経験があり、同様にオブジェクトの割り当てを初期化から分離しているので、その区別は私にとっては自然なことです。
Python C API tutorialはこのようにそれを説明する:
新しいメンバーが は(初期化ではなく)タイプの オブジェクトを作成するための責任があります。それは
__new__()
メソッドとして Pythonで公開されています。 ... 新しいメソッドを実装する理由の1つは、 インスタンス変数の初期値を保証することです。
だから、ええ - 私は何をするか__new__
を取得が、それはPythonで便利ですなぜこれにもかかわらず、私はまだ理解していない。与えられた例では、__new__
は "インスタンス変数の初期値を保証"したい場合に役に立ちます。さて、__init__
はどういうことでしょうか?
C APIチュートリアルでは、新しいタイプ(「Noddy」と呼ばれる)が作成され、タイプの__new__
関数が定義されている例が示されています。 Noddyクラスタイプはfirst
と呼ばれる文字列のメンバーが含まれており、この文字列のメンバーはそうのように空の文字列に初期化されます。ここで定義され__new__
方法なしに、我々は単に初期化PyType_GenericNew
を使用する必要があるだろうということ
static PyObject * Noddy_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
.....
self->first = PyString_FromString("");
if (self->first == NULL)
{
Py_DECREF(self);
return NULL;
}
.....
}
注意すべてのインスタンス変数メンバをNULLに設定します。したがって、__new__
メソッドの唯一の利点は、インスタンス変数がNULLではなく空の文字列として開始されることです。 しかし、インスタンス変数がデフォルト値に初期化されていることを気にすると、__init__
メソッドでこれを実行できたのでしょうか?
ボイラープレートは決して変更されないので、 '__new__'で"ボイラープレート "と呼ぶコードはボイラープレートではありません。場合によっては、その特定のコードを別のものに置き換える必要があります。 –
インスタンス(通常は 'super'コール)を作成するか、インスタンスを返すことは、' __new__'実装の必要な部分であり、私が参照している "定型句"です。対照的に、 'pass'は' __init__'のための有効な実装です - 必要な振る舞いはまったくありません。 – ncoghlan