The question I'm about to ask seems to be a duplicate of Python's use of __new__ and __init__?, but regardless, it's still unclear to me exactly what the practical difference between __new__
and __init__
is.
Before you rush to tell me that __new__
is for creating objects and __init__
is for initializing objects, let me be clear: I get that. In fact, that distinction is quite natural to me, since I have experience in C++ where we have placement new, which similarly separates object allocation from initialization.
The Python C API tutorial explains it like this:
The new member is responsible for
creating (as opposed to initializing)
objects of the type. It is exposed in
Python as the __new__()
method. ...
One reason to implement a new method is to assure the initial values of
instance variables.
So, yeah - I get what __new__
does, but despite this, I still don't understand why it's useful in Python. The example given says that __new__
might be useful if you want to "assure the initial values of instance variables". Well, isn't that exactly what __init__
will do?
In the C API tutorial, an example is shown where a new Type (called a "Noddy") is created, and the Type's __new__
function is defined. The Noddy type contains a string member called first
, and this string member is initialized to an empty string like so:
static PyObject * Noddy_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
.....
self->first = PyString_FromString("");
if (self->first == NULL)
{
Py_DECREF(self);
return NULL;
}
.....
}
Note that without the __new__
method defined here, we'd have to use PyType_GenericNew
, which simply initializes all of the instance variable members to NULL. So the only benefit of the __new__
method is that the instance variable will start out as an empty string, as opposed to NULL. But why is this ever useful, since if we cared about making sure our instance variables are initialized to some default value, we could have just done that in the __init__
method?
Question&Answers:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…