← Все вопросы
Чем отличается @staticmethod от @classmethod?
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.
Ваш ответ
Войдите, чтобы ответить на вопрос.