Разница между staticmethod и classmethod?

@staticmethod — это метод, который не получает ни self, ни cls автоматически, он не знает ни об экземпляре, ни о классе, и ведёт себя как обычная функция, просто «привязанная» к классу для логической группировки. @classmethod — метод, который вместо self получает первым аргументом cls — сам класс, поэтому может работать с класс‑уровневым состоянием (атрибуты и другие classmethod’ы) и корректно учитывать наследование.

Подробный ответ

Ключевое отличие между staticmethod и classmethod: есть ли автоматический доступ к классу (cls).

Что такое staticmethod?

Статический метод объявляется так:

class User:
   @staticmethod
   def validate_email(email: str) -> bool:
       return "@" in email

Свойства:

  1. Не принимает self или cls автоматически — все аргументы задаются явно.

  2. Не может обращаться к атрибутам класса или экземпляра, если их явно не передать.

  3. Логически относится к классу, но не зависит от его состояния — по сути, это «обычная функция внутри класса».

Типичный пример в backend‑коде: небольшая утилита, связанная по смыслу с доменной сущностью (валидация, простые преобразования), но не использующая состояние объекта или класса.

Что такое classmethod?

Классовый метод объявляется так:

class User:
   users_count = 0
   def __init__(self, name):
       self.name = name
       User.users_count += 1
       
   @classmethod
   def from_full_name(cls, full_name: str) -> "User":
       first, last = full_name.split()
       return cls(first + " " + last)

Свойства:

  1. Первым аргументом получает cls — сам класс, на котором метод был вызван (учитывает наследование).

  2. Может читать и изменять класс‑уровневые атрибуты (cls.users_count, cls.config).

  3. Часто используется как альтернативный конструктор (factory method): создаёт экземпляры разными способами, при этом при наследовании возвращает экземпляр нужного подкласса.

Это особенно важно в иерархиях моделей в backend‑проектах: classmethod корректно вернёт объект конкретного подкласса, если вызвать его на подклассе.

Как кратко ответить на собеседовании?

@staticmethod — это обычная функция внутри класса, у неё нет доступа ни к экземпляру, ни к классу, она используется как утилита, логически связанная с классом. @classmethod вместо self получает cls, то есть сам класс, и может работать с класс‑уровневым состоянием и создавать экземпляры, учитывая наследование. Разница в том, нужен ли методу доступ к классу — если да, это classmethod, если нет — staticmethod.

Оцени свой прогресс

Честно оцени своё понимание этого вопроса, чтобы мы могли построить твой учебный трек максимально эффективно.
Читать в блоге