Чтобы сделать как ответ выше, вы можете переопределить метод фрагмента onAttach
:
public static class DummySectionFragment extends Fragment{
...
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
DBHelper = new DatabaseHelper(activity);
}
}
Один из возможных ответов из сообщения guido (спасибо @ fraca7):
Например, в модуле pickle
__ new __
используется для создания экземпляры при десериализации объектов. В этом случае экземпляры создаются, но метод__ init __
не вызывается.
Есть ли другие похожие ответы?
Я принимаю этот ответ как «да» на свой вопрос:
Мне интересно, есть ли что-нибудь
__ init __
, которое может это сделать] __ new __
не может?
Да, в отличие от __ new __
, действия, которые вы вводите в метод __ init __
, не будут выполняться в процессе распаковки. __ new __
не может сделать это различие.
Итак, класс класса обычно равен 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__()
.
Ну, поиск __new__ vs __init__
в Google показал мне это .
Короче говоря, __new__
возвращает новый экземпляр объекта, а __init__
ничего не возвращает и просто инициализирует членов класса.
РЕДАКТИРОВАТЬ: Чтобы действительно ответить на ваш вопрос, вам никогда не нужно переопределять __new__
, если вы не подклассы неизменяемых типов.