← Назад к вопросам

Какой обязательный параметр для описания класса new?

2.3 Middle🔥 171 комментариев
#REST API и HTTP

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Обязательный параметр метода new

Для описания класса в Python метод __new__ требует обязательный параметр cls — это первый позиционный аргумент, который представляет сам класс.

Синтаксис и назначение

class MyClass:
    def __new__(cls, *args, **kwargs):
        # cls — обязательный параметр
        instance = super().__new__(cls)
        return instance

    def __init__(self, value):
        self.value = value

Метод __new__ вызывается ДО __init__ и отвечает за создание нового экземпляра класса. Параметр cls автоматически передаётся Python и указывает на класс, для которого создаётся объект.

Как это работает

Когда ты создаёшь объект:

obj = MyClass(42)

Внутри Python выполняет:

  1. instance = MyClass.__new__(MyClass) — создание объекта
  2. instance.__init__(42) — инициализация объекта

Практический пример с Singleton

class Singleton:
    _instance = None

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

obj1 = Singleton()
obj2 = Singleton()
print(obj1 is obj2)  # True — один и тот же объект

Отличие от init

МетодВызываетсяВозвращаетНазначение
__new__ПервымЭкземпляр классаСоздание объекта
__init__ВторымNoneИнициализация объекта

Важные моменты

  • cls всегда обязателен — это магический параметр для методов класса
  • Параметр называется cls по соглашению, но можно любое имя (не рекомендуется)
  • __new__ должен вернуть экземпляр класса, иначе __init__ не вызовется
  • Если __new__ возвращает другой класс, __init__ вызван не будет
class Parent:
    def __new__(cls):
        return object.__new__(object)  # Возвращаем не наш класс

# __init__ не вызовется, так как возвращён object, а не Parent

Это фундаментальный механизм Python, необходимый для понимания объектно-ориентированного программирования.