Вопрос 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 __
?