Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Python: singleton, new

Почему чаще переопределяют __new__, а не __call__ при реализации Singleton?

Вопрос проверяет понимание жизненного цикла объектов в Python и различий между созданием экземпляра и вызовом объекта

Короткий ответ

__new__ отвечает за создание объекта, а __call__ — за вызов уже существующего объекта. Singleton должен контролировать именно процесс создания экземпляра. Переопределяя __new__, можно гарантировать, что объект будет создан только один раз. Использование __call__ усложняет реализацию и делает поведение менее очевидным. Поэтому __new__ считается более корректным местом.

Длинный ответ

Разница между __new__ и __call__ принципиальна и связана с этапами работы Python с объектами.

Определение

  • __new__ — метод создания экземпляра класса

  • __call__ — метод вызова объекта как функции

Почему Singleton реализуют через __new__

Основные причины:

  1. Контроль создания объекта
    Singleton должен предотвращать повторное создание экземпляров, а это происходит именно в __new__.

  2. Прозрачное использование

    a = Singleton()
    b = Singleton()

    В обоих случаях возвращается один и тот же объект без скрытой логики.

  3. Корректная инициализация
    __init__ вызывается после __new__, поэтому можно избежать повторной инициализации.

Типичная реализация

class Singleton:
    _instance = None

    def __new__(cls):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
        return cls._instance

Почему не __call__

Использование __call__:

  • требует метакласса

  • усложняет код

  • ломает ожидания разработчиков

Вывод

__new__ — правильная точка расширения для Singleton, так как именно он отвечает за факт существования экземпляра, а не за его поведение.

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    7

Навыки

  • Python

    Python

Ключевые слова

#singleton

#new

Подпишись на Python Developer в телеграм

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.