【发布时间】:2011-06-19 01:12:46
【问题描述】:
我要问的问题似乎与Python's use of __new__ and __init__? 重复,但无论如何,我仍然不清楚__new__ 和__init__ 之间的实际区别是什么。
在你急于告诉我__new__ 用于创建对象而__init__ 用于初始化对象之前,让我明确一点:我明白了。 事实上,这种区别是很自然的对我来说,因为我有 C++ 经验,我们有 placement new,它同样将对象分配与初始化分开。
Python C API tutorial 是这样解释的:
新成员负责 创建(相对于初始化) 类型的对象。它暴露在 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__ 方法中做到这一点?
【问题讨论】:
标签: python c python-c-api