我要问的问题似乎是Python对__new__和__init__的重复使用?,但无论如何,我仍然不清楚__new__
和之间的实际区别是什么__init__
。
在您急于告诉我__new__
创建对象和__init__
初始化对象之前,请让我明确:我明白了。 实际上,这种区分对我来说是很自然的,因为我在C ++中有经验,在那里我们放置了new,它类似地将对象分配与初始化分开。
在Python的C API教程解释它是这样的:
新成员负责创建(而不是初始化)该类型的对象。它在Python中作为
__new__()
方法公开。... 实施新方法的原因之一是要确保实例变量的初始值。
所以,是的-我明白了__new__
,但是尽管如此,我仍然不明白为什么它在Python中很有用。给出的示例说,__new__
如果要“确保实例变量的初始值” ,这可能会很有用。好吧,这不正是要做__init__
什么吗?
在C API教程中,显示了一个示例,其中创建了新的Type(称为“ Noddy”),并__new__
定义了Type的功能。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__
不是样板,因为样板永远不会改变。有时您需要用不同的内容替换该特定代码。