Для управления созданием экземпляра переопределяют new; init инициализирует уже созданный объект. Однако singleton через new требует учёта повторной инициализации и конкурентных вызовов.
Какой метод нужно переопределить, чтобы изменить стандартное поведение при создании экземпляра класса, например реализовать singleton?
Для управления созданием экземпляра переопределяют __new__; __init__ инициализирует уже созданный объект. Однако singleton через __new__ требует учёта повторной инициализации и конкурентных вызовов.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Для управления созданием экземпляра переопределяют new; init инициализирует уже созданный объект. Однако singleton через new требует учёта повторной инициализации и конкурентных вызовов.
__new__ должен вернуть экземпляр; если это объект подходящего класса, затем обычно вызывается init. Возврат ранее созданного singleton не отменяет этот повторный вызов автоматически. Кроме потоков, нужно определить поведение наследования, сериализации и разных процессов. Во многих приложениях проще явно передавать единственный экземпляр через зависимости, чем скрывать глобальное состояние в конструкторе.