La question que je vais poser semble être un doublon de Python d'utilisation de l' __new__ et __init__ ?, mais peu importe, il est pas encore clair pour moi exactement ce que la pratique, la différence entre __new__
et __init__
.
Avant de vous précipiter pour me dire qu' __new__
est pour la création d'objets et d' __init__
est pour l'initialisation des objets, laissez-moi être clair: je le conçois. En fait, cette distinction est tout à fait naturel pour moi, depuis j'ai de l'expérience en C++, où nous avons le placement de nouveaux, de la même façon qui sépare l'objet de l'allocation de l'initialisation.
Le Python API C tutoriel explique comme ceci:
Le nouveau membre est responsable de l' la création (par opposition à l'initialisation) les objets de ce type. Il est exposé dans Python comme la nouvelleméthode. ... Une raison de mettre en œuvre une nouvelle méthode est de garantir les valeurs initiales de les variables d'instance.
Donc, oui - je obtenir ce qu' __new__
, mais malgré cela, j'ai toujours ne pas comprendre pourquoi il est utile en Python. L'exemple donné dit qu' __new__
peut être utile si vous voulez vous "rassurer les valeurs initiales des variables d'instance". Eh bien, n'est-ce pas exactement ce qu' __init__
va faire?
Dans l'API C tutoriel, un exemple est montré où un nouveau Type (appelé un "oui-oui") est créée, et le Type de l' __new__
fonction est définie. Le Noddy type contient une chaîne de membres appelés first
, et cette chaîne membre est initialisé à une chaîne vide comme ceci:
static PyObject * Noddy_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
.....
self->first = PyString_FromString("");
if (self->first == NULL)
{
Py_DECREF(self);
return NULL;
}
.....
}
Notez que sans le __new__
méthode définie ici, nous aurions du utiliser PyType_GenericNew
, ce qui initialise simplement tous de la variable d'instance membres à NULL. Donc, le seul avantage de l' __new__
méthode est que la variable d'instance va commencer comme une chaîne vide, par opposition à la valeur NULL. Mais pourquoi est-ce toujours utile, puisque si l'on se souciait de faire en sorte que nos variables d'instance sont initialisés à des valeurs par défaut, nous pourrions en ont fait juste que, dans l' __init__
méthode?