Python (и Python C API): __new__ против __init __

Вопрос I ' m, собирающийся спросить, похоже, дублирует использование Python __new__ и __init __? , но, несмотря на это, мне все еще неясно, в чем именно практическая разница между __ new __ и __ init__ есть.

Прежде чем вы поспешите сказать мне, что __ new __ предназначен для создания объектов, а __ init __ для инициализации объектов, позвольте мне пояснить: Я понимаю . На самом деле, это различие для меня вполне естественно, поскольку у меня есть опыт работы с C ++, где у нас есть размещение new , которое аналогичным образом отделяет выделение объекта от инициализации.

В руководстве Python C API это объясняется следующим образом:

Новый член отвечает за s использование __new__ и __init __? , но, тем не менее, мне все еще неясно, в чем именно практическая разница между __ new __ и __ init __ .

Прежде чем вы спешите рассказать мне, что __ new __ предназначен для создания объектов, а __ init __ - для инициализации объектов, позвольте мне пояснить: Я понимаю. На самом деле, это различие для меня вполне естественно, поскольку у меня есть опыт работы с C ++, где у нас есть размещение new , которое аналогичным образом отделяет выделение объекта от инициализации.

В руководстве Python C API это объясняется следующим образом:

Новый член отвечает за s использование __new__ и __init __? , но, тем не менее, мне все еще неясно, в чем заключается практическая разница между __ new __ и __ init __ .

Прежде чем вы спешите рассказать мне, что __ new __ предназначен для создания объектов, а __ init __ - для инициализации объектов, позвольте мне пояснить: Я понимаю. На самом деле, это различие для меня вполне естественно, поскольку у меня есть опыт работы с C ++, где у нас есть размещение new , которое аналогичным образом отделяет выделение объекта от инициализации.

В руководстве Python C API это объясняется следующим образом:

Новый член отвечает за Мне до сих пор неясно, в чем заключается практическая разница между __ new __ и __ init __ .

Прежде чем вы поспешите сказать мне, что __ new __ предназначен для создания объектов и __ init __ предназначен для инициализации объектов, позвольте мне пояснить: Я понимаю. На самом деле, это различие для меня вполне естественно, поскольку у меня есть опыт работы с C ++, где у нас есть размещение new , которое аналогичным образом отделяет выделение объекта от инициализации.

В руководстве Python C API это объясняется следующим образом:

Новый член отвечает за мне до сих пор неясно, в чем заключается практическая разница между __ new __ и __ init __ .

Прежде чем вы поспешите сказать мне, что __ new __ предназначен для создания объектов и __ init __ предназначен для инициализации объектов, позвольте мне пояснить: Я понимаю. На самом деле, это различие для меня вполне естественно, поскольку у меня есть опыт работы с C ++, где у нас есть размещение new , которое аналогичным образом отделяет выделение объекта от инициализации.

В руководстве Python C API это объясняется следующим образом:

Новый член отвечает за это различие вполне естественно для меня, поскольку у меня есть опыт работы с C ++, где у нас есть размещение new , которое аналогичным образом отделяет выделение объекта от инициализации.

В руководстве Python C API это объясняется следующим образом:

Новый член отвечает за это различие вполне естественно для меня, поскольку у меня есть опыт работы с C ++, где у нас есть размещение new , которое аналогичным образом отделяет выделение объекта от инициализации.

В руководстве Python C API это объясняется следующим образом:

Новый член отвечает за создание (в отличие от инициализации) объекты типа. Он выставлен в 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 __ мы ' d придется использовать PyType_GenericNew , который просто инициализирует все члены переменных экземпляра значением NULL. Таким образом, единственное преимущество метода __ new __ заключается в том, что переменная экземпляра будет начинаться с пустой строки, а не с NULL. Но почему это вообще полезно, ведь если бы мы позаботились о том, чтобы переменные нашего экземпляра были инициализированы некоторым значением по умолчанию, мы могли бы просто сделать это в методе __ init __ ?

117
задан Community 23 May 2017 в 12:03
поделиться