Выбор ответа Junior ООП и dataclasses спрашивают часто обновлено

classmethod против staticmethod

Вопрос

Почему альтернативный конструктор from_dict обычно делают @classmethod, а не @staticmethod?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: classmethod получает cls и в наследнике создаст наследника. Внутри @classmethod пишут return cls(data), и вызов Admin.fromdict(...) вернёт Admin.

Варианты ответа

  1. classmethod получает cls и в наследнике создаст наследникаправильный ответ
  2. staticmethod не может возвращать объекты своего класса
  3. classmethod работает быстрее за счёт кеша
  4. staticmethod нельзя вызвать через имя класса, только у объекта

Разбор

Внутри @classmethod пишут return cls(**data), и вызов Admin.from_dict(...) вернёт Admin. В @staticmethod класс пришлось бы назвать явно (User(**data)), и наследник получил бы объект родителя. Статический метод можно вызывать через класс и возвращать что угодно, а разница в скорости не играет роли.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме