Урок курса

classmethod, staticmethod и обычный метод в Python

Python для продвинутых: ООП, типизация и тестирование

Обычный метод получает экземпляр первым аргументом — по соглашению self. Он читает и меняет состояние конкретного объекта и может обращаться к классу через type(self).

class Account:
    fee_rate = 0.02

    def __init__(self, balance: float):
        self.balance = balance

    def fee(self) -> float:
        return self.balance * self.fee_rate

Вызов account.fee() автоматически связывает account с параметром self. Если поведение зависит от данных экземпляра, это обычный метод — дополнительные декораторы не нужны.

classmethod и альтернативный конструктор

Метод с @classmethod получает класс в параметре cls. Это полезно для именованного конструктора и поведения, которое должно корректно работать у наследников.

class Account:
    def __init__(self, balance: float):
        self.balance = balance

    @classmethod
    def from_cents(cls, cents: int):
        return cls(cents / 100)

Использование cls(...), а не жёсткого Account(...), сохраняет полиморфизм. Classmethod также может читать class-level конфигурацию, но общее изменяемое состояние класса требует осторожности.

staticmethod — функция в namespace класса

@staticmethod не получает автоматически ни self, ни cls. Это обычная функция, размещённая в классе, потому что предметно связана с ним.

Если функция нужна только внутренней реализации и не является частью понятного API типа, модульная функция часто проще. Staticmethod не даёт доступ к состоянию и не делает код «объектно-ориентированнее».

Выбор можно свести к трём вопросам: нужны поля конкретного объекта — instance method; нужен сам тип или альтернативный конструктор — classmethod; не нужен ни объект, ни тип, но операция естественно принадлежит публичному namespace класса — staticmethod. Не выбирайте декоратор по тому, сколько аргументов хочется скрыть.

Попробуйте решить

Почему альтернативный конструктор обычно делают classmethod и возвращают cls(...)?

Продолжить с проверкой и прогрессом

Откройте интерактивный раннер с заданиями урока.

Перейти к интерактивному уроку