我要问的问题似乎是 Python 使用 _ _ new _ _ 和 _ _ init _ _?的复制品,但无论如何,我仍然不清楚 __new__
和 __init__
之间的实际差异究竟是什么。
在你急着告诉我 __new__
是用来创建对象的,而 __init__
是用来初始化对象的之前,让我先说清楚: 我明白。事实上,这种区别对我来说是很自然的,因为我在 C + + 中有经验,我们有 新的位置,它类似地将对象分配和初始化分离开来。
Python C API 教程是这样解释的:
新成员负责 创建(相对于初始化) 类型的对象。它在 Python 作为
__new__()
方法..。 实现新方法的一个原因是确保 实例变量 .
所以,是的-我 走开什么 __new__
做,但尽管如此,我 还是不明白为什么它在 Python 中有用。给出的例子说明,如果您想“确保实例变量的初始值”,__new__
可能是有用的。这不正是 __init__
要做的吗?
在 C API 教程中,一个示例显示了创建新 Type (称为“ Noddy”)的地方,并定义了 Type 的 __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__
方法中这样做?