我現在要問的問題似乎是Python's use of __new__ and __init__?的重複,但無論如何,我現在還不清楚__new__
和__init__
之間的實際區別是什麼。Python(和Python C API):__new__與__init__
在您急於告訴我__new__
用於創建對象並且__init__
用於初始化對象之前,請讓我清楚:我明白了。事實上,這種區分對我來說很自然,因爲我有C++的經驗,我們有placement new,它類似地將對象分配與初始化分開。
的Python C API tutorial解釋這樣的:
新成員負責創建 (相對於初始化)的類型的 對象。它作爲
__new__()
方法在 Python中公開。 ... 實施新方法的一個原因是確保 實例變量的初始值。
所以,是的 - 我得到做什麼__new__
,但儘管這樣,我還是不明白爲什麼它在Python是非常有用的。給出的例子說如果你想「確保實例變量的初始值」,__new__
可能是有用的。那麼,是不是__init__
會做什麼?
在C API教程中,顯示了一個示例,其中創建了一個新類型(稱爲「Noddy」),並定義了類型的__new__
函數。諾迪類型包含稱爲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__`中引用爲「樣板」的代碼不是樣板,因爲樣板不會更改。有時你需要用不同的東西替換特定的代碼。 – 2013-01-23 07:34:09
創建或以其他方式獲取實例(通常使用`super`調用)並返回實例是任何`__new__`實現的必要部分,以及我所指的「樣板」。相比之下,`pass`是`__init__`的有效實現 - 不需要任何行爲。 – ncoghlan 2013-01-24 10:08:28