我要问的问题似乎与Python 对 __new__ 和 __init__ 的使用重复?,但无论如何,我仍然不清楚和之间的实际区别__new__
是什么__init__
。
在你急于告诉我这__new__
是用于创建对象和__init__
初始化对象之前,让我明确一点:我明白了。 事实上,这种区别对我来说是很自然的,因为我在 C++ 中有过放置 new的经验,它同样将对象分配与初始化分开。
Python C API 教程是这样解释的:
新成员负责创建(而不是初始化)该类型的对象。它在 Python 中作为
__new__()
方法公开。... 实现新方法的一个原因是确保实例变量的初始值。
所以,是的 - 我明白了__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__
方法中做到这一点?