Python: всегда используйте __ новый __ вместо __ init __?

Чтобы сделать как ответ выше, вы можете переопределить метод фрагмента onAttach:

public static class DummySectionFragment extends Fragment{
...
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        DBHelper = new DatabaseHelper(activity);
    }
}
27
задан EoghanM 28 June 2010 в 10:05
поделиться

3 ответа

Один из возможных ответов из сообщения guido (спасибо @ fraca7):

Например, в модуле pickle __ new __ используется для создания экземпляры при десериализации объектов. В этом случае экземпляры создаются, но метод __ init __ не вызывается.

Есть ли другие похожие ответы?


Я принимаю этот ответ как «да» на свой вопрос:

Мне интересно, есть ли что-нибудь __ init __ , которое может это сделать ] __ new __ не может?

Да, в отличие от __ new __ , действия, которые вы вводите в метод __ init __ , не будут выполняться в процессе распаковки. __ new __ не может сделать это различие.

4
ответ дан 28 November 2019 в 05:44
поделиться

Итак, класс класса обычно равен type, и когда вы вызываете Class(), метод __call__() класса Class обрабатывает это. Я считаю, что type.__call__() реализован более или менее так:

def __call__(cls, *args, **kwargs):
    # should do the same thing as type.__call__
    obj = cls.__new__(cls, *args, **kwargs)
    if isinstance(obj, cls):
        obj.__init__(*args, **kwargs)
    return obj

Прямой ответ на ваш вопрос - нет, то, что __init__() может сделать (изменить / «инициализировать» указанный экземпляр), подмножество вещей, которые __new__() может сделать (создать или иным образом выбрать любой объект, который он хочет, сделать что-нибудь с этим объектом, который он хочет, прежде чем объект будет возвращен).

Однако удобно использовать оба метода. Использовать __init__() проще (не нужно ничего создавать, ничего не возвращать), и я считаю, что лучше всегда использовать __init__(), если у вас нет особой причины использовать __new__().

22
ответ дан Matt Anderson 28 November 2019 в 05:44
поделиться

Ну, поиск __new__ vs __init__ в Google показал мне это .

Короче говоря, __new__ возвращает новый экземпляр объекта, а __init__ ничего не возвращает и просто инициализирует членов класса.

РЕДАКТИРОВАТЬ: Чтобы действительно ответить на ваш вопрос, вам никогда не нужно переопределять __new__, если вы не подклассы неизменяемых типов.

2
ответ дан Federico klez Culloca 28 November 2019 в 05:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: