← Все вопросы

Чем отличается @staticmethod от @classmethod?

Задан 16 месяцев назад721 просмотров2 ответа
13

Есть обычные методы с self, а есть с декораторами @staticmethod и @classmethod. Когда какой использовать?

2 ответа

23
✓ Принятый ответ — помог автору

Разница в том, что им передаётся первым аргументом:

  • Обычный метод — получает self (конкретный объект).
  • @classmethod — получает cls (сам класс). Удобно для альтернативных конструкторов.
  • @staticmethod — не получает ничего автоматически. Это просто функция, логически связанная с классом, но не использующая ни объект, ни класс.
class Pizza:
    def __init__(self, size):
        self.size = size

    @classmethod
    def large(cls):
        return cls(30)   # альтернативный конструктор

    @staticmethod
    def is_valid_size(size):
        return size in (25, 30, 35)

p = Pizza.large()              # classmethod создаёт объект
print(Pizza.is_valid_size(30)) # staticmethod просто проверяет

Правило выбора: нужен объект — обычный метод; нужен класс (например создать его экземпляр) — classmethod; не нужно ни то ни другое — staticmethod.

Иван Иванов альтернативный конструктор через cls — наконец понял зачем classmethod нужен · 15 месяцев назад
9

classmethod знает про класс (cls), staticmethod не знает ни про объект, ни про класс — просто функция в неймспейсе класса. Если внутри не используешь ни self, ни cls — бери staticmethod.

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект