私が尋ねようとしている質問は、Pythonの__new__と__init__の使用の複製のようです?しかしかかわらず、それは私にはまだ間、まさに実用的な違いは不明だ__new__
と__init__
あります。
__new__
オブジェクトを作成するためのもので__init__
あり、オブジェクトを初期化するためのものであると急いで説明する前に、はっきりさせておきます。 実際、C ++で配置newがあり、オブジェクトの割り当てと初期化を分離している経験があるので、その区別は私にとって非常に自然です。
PythonのC APIのチュートリアルでは、このようにそれを説明します:
新しいメンバーは、タイプのオブジェクトを(初期化するのではなく)作成します。
__new__()
メソッドとしてPythonで公開されています。... 新しいメソッドを実装する1つの理由は、インスタンス変数の初期値を保証することです。
だから、ええ-私は得るものを__new__
行いますが、これにもかかわらず、私はまだそれがPythonで便利だ理由を理解していません。与えられた例は、__new__
「インスタンス変数の初期値を保証する」場合に役立つ可能性があることを示しています。さて、それはまさに何を__init__
するのでしょうか?
C APIチュートリアルでは、新しいタイプ(「Noddy」と呼ばれる)が作成され、タイプの__new__
関数が定義されている例が示されています。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__
メソッドでそれを実行できたでしょうか。
__new__
ボイラープレートは変更されないため、「ボイラープレート」として参照しているコードはボイラープレートではありません。特定のコードを別のコードに置き換える必要がある場合があります。