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.