classmethod()

Декоратор @classmethod превращает обычный метод в метод класса: первым аргументом он получает не экземпляр (self), а сам класс (по соглашению — cls). Удобно для альтернативных конструкторов и методов, работающих с классом в целом.

Сигнатура

@classmethod
def method(cls, ...):
    ...

Возвращает: объект-метод класса.

Примеры

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

class Date:
    def __init__(self, year, month, day):
        self.year, self.month, self.day = year, month, day

    @classmethod
    def from_string(cls, s):
        y, m, d = map(int, s.split("-"))
        return cls(y, m, d)

    def __repr__(self):
        return f"Date({self.year}-{self.month:02d}-{self.day:02d})"

d = Date.from_string("2026-05-15")
print(d)
Date(2026-05-15)

Доступ к атрибутам класса:

class Counter:
    total = 0

    @classmethod
    def increment(cls):
        cls.total += 1
        return cls.total

print(Counter.increment())
print(Counter.increment())
print(Counter.total)
1
2
2

Работа с наследованием — cls берётся правильным:

class Animal:
    @classmethod
    def create(cls, name):
        return cls(name)
    def __init__(self, name):
        self.name = name

class Dog(Animal):
    pass

a = Animal.create("Барсик")
d = Dog.create("Рекс")
print(type(a).__name__, a.name)
print(type(d).__name__, d.name)
Animal Барсик
Dog Рекс

Несколько фабрик:

class Robot:
    def __init__(self, name, battery):
        self.name = name
        self.battery = battery

    @classmethod
    def fresh(cls, name):
        return cls(name, 100)

    @classmethod
    def empty(cls, name):
        return cls(name, 0)

print(vars(Robot.fresh("Phobo")))
print(vars(Robot.empty("OldBot")))
{'name': 'Phobo', 'battery': 100}
{'name': 'OldBot', 'battery': 0}

См. также

Примечание

Описание основано на официальной документации Python (docs.python.org), распространяемой под лицензией PSF License v2. © Python Software Foundation.