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