Смотрите что метод реально использует:
— нужен self → instance method
— нужен cls, но не конкретный экземпляр → @classmethod
— не нужно ни то ни другое → @staticmethod
🔵 Instance method — работа с состоянием объекта
Всё что читает или меняет атрибуты конкретного экземпляра. Стандарт по умолчанию.
🟢 @classmethod — альтернативные конструкторы
Python не поддерживает перегрузку init, поэтому когда нужно создать объект из разных источников — каждый способ становится classmethod:
# из стандартной библиотеки
date.today()
date.fromtimestamp(1718539200)
date.fromisoformat("2026-06-16")
Все возвращают date, но стартуют из разного сырья. Ещё один хороший кейс — реестры и кэши на уровне класса:
class Handler:
_registry: dict[str, type["Handler"]] = {}
@classmethod
def register(cls, name: str, handler: type["Handler"]) -> None:
cls._registry[name] = handler
🟡 @staticmethod — утилита без контекста
Чистая функция которая живёт в классе для удобства неймспейса. Не трогает ни self ни cls:
class Color:
@staticmethod
def hex2rgb(hex_value: str) -> tuple[int, int, int]:
return tuple(int(hex_value[i:i+2], 16) for i in (1, 3, 5))
Сигнал: если staticmethod можно вынести на уровень модуля и ничего не сломается — возможно, так и стоит сделать. Это не плохой паттерн, просто честный вопрос.
📍 Навигация: Вакансии • Задачи • Собесы
Библиотека питониста
#буст