Как работает __new__ в приведенном коде?

Увидел пример Singleton'a, не совсем понимаю указанную строчку кода.
class Singleton:
	instance = None

	def __new__(cls):
		if cls.instance is None:
			cls.instance = super().__new__(cls) # <-- данная строчка вызывает проблемы
		return cls.instance

a = Singleton()
b = Singleton()
print(a is b) # True

Функция super() обращается к родителю класса, т.к. к object, насколько я понимаю.
Мне непонятно, почему для создания нового экземпляра класса вызывается магический метод __new__ класса-родителя.
  • Вопрос задан
  • 794 просмотра
Решения вопроса 1
Bobsans
@Bobsans
Full-Stack Developer
__new__ из object'а вызвался бы в любом случае. Это и есть создание экземпляра объекта. Просто в данном примере мы его переопределили и вызываем super() для выполнения кода из метода __new__ родителя.
В примере в __new__ передается cls. cls - это тип объекта, который необходимо создать.
То же самое можно сделать и так:
def __new__(cls):
    if cls.instance is None:
        cls.instance = object.__new__(cls)
    return cls.instance

Или так:
class ClassA:
   pass

instance = object.__new__(ClassA) # <ClassA object at 0x0....>
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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