Ключевое отличие между staticmethod и classmethod: есть ли автоматический доступ к классу (cls).
Что такое staticmethod?
Статический метод объявляется так:
class User:
@staticmethod
def validate_email(email: str) -> bool:
return "@" in emailСвойства:
Не принимает self или cls автоматически — все аргументы задаются явно.
Не может обращаться к атрибутам класса или экземпляра, если их явно не передать.
Логически относится к классу, но не зависит от его состояния — по сути, это «обычная функция внутри класса».
Типичный пример в 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)Свойства:
Первым аргументом получает cls — сам класс, на котором метод был вызван (учитывает наследование).
Может читать и изменять класс‑уровневые атрибуты (cls.users_count, cls.config).
Часто используется как альтернативный конструктор (factory method): создаёт экземпляры разными способами, при этом при наследовании возвращает экземпляр нужного подкласса.
Это особенно важно в иерархиях моделей в backend‑проектах: classmethod корректно вернёт объект конкретного подкласса, если вызвать его на подклассе.
Как кратко ответить на собеседовании?
@staticmethod — это обычная функция внутри класса, у неё нет доступа ни к экземпляру, ни к классу, она используется как утилита, логически связанная с классом. @classmethod вместо self получает cls, то есть сам класс, и может работать с класс‑уровневым состоянием и создавать экземпляры, учитывая наследование. Разница в том, нужен ли методу доступ к классу — если да, это classmethod, если нет — staticmethod.