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

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

Ключевое отличие между staticmethod и classmethod — есть ли у метода автоматический доступ к самому классу через cls.

Что такое staticmethod?

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

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

Свойства staticmethod:

  1. Метод не получает self или cls автоматически — все аргументы ты передаёшь явно.

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

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

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

Что такое 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:

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

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

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

В иерархиях моделей это важно: cls соответствует конкретному подклассу, на котором ты вызвал метод.

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

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

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

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