我现在要问的问题似乎是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