Python Glossary English

все Python 3ООПпонятие

@classmethod

классы

Метод класса. Первый параметр — cls (ссылка на класс). Используется для альтернативных конструкторов.

Синтаксис

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

cls — это тот класс, на котором метод фактически вызвали, поэтому в подклассе cls(...) построит объект подкласса, а не родителя; именно за это classmethod ценят в альтернативных конструкторах. Если фабрике сам класс не нужен, берите staticmethod или обычную функцию. Старые учебники показывают @classmethod поверх @property как «свойство класса»: это работало в 3.9–3.12, устарело в 3.11 и удалено в 3.13 — теперь A.name вернёт связанный метод, а не значение.

Примеры

class Date:
    def __init__(self, y, m, d):
        self.y, self.m, self.d = y, m, d
    @classmethod
    def from_string(cls, s):
        y, m, d = map(int, s.split('-'))
        return cls(y, m, d)
d = Date.from_string('2024-03-15')
print(d.y, d.m, d.d)  # → 2024 3 15
class Dog:
    count = 0
    def __init__(self, name):
        self.name = name
        Dog.count += 1
    @classmethod
    def get_count(cls):
        return cls.count
Dog('Rex'); Dog('Max')
print(Dog.get_count())  # → 2
class Temperature:
    def __init__(self, celsius):
        self.celsius = celsius
    @classmethod
    def from_fahrenheit(cls, f):
        return cls((f - 32) * 5/9)
    @classmethod
    def from_kelvin(cls, k):
        return cls(k - 273.15)
t = Temperature.from_fahrenheit(212)
print(round(t.celsius))  # → 100
class Pizza:
    ingredients = []
    def __init__(self, ingredients):
        self.ingredients = ingredients
    @classmethod
    def margherita(cls):
        return cls(['mozzarella', 'tomato'])
    @classmethod
    def hawaiian(cls):
        return cls(['mozzarella', 'tomato', 'pineapple'])
p = Pizza.margherita()
print(p.ingredients)  # → ['mozzarella', 'tomato']
# Через экземпляр тоже работает
class A:
    x = 10
    @classmethod
    def get_x(cls):
        return cls.x
a = A()
print(a.get_x())  # → 10
# Наследование + classmethod
class Animal:
    @classmethod
    def make(cls, name):
        obj = cls.__new__(cls)
        obj.name = name
        return obj
class Cat(Animal):
    pass
cat = Cat.make('Whiskers')
print(type(cat).__name__, cat.name)  # → Cat Whiskers
# Python 3.13+
class A:
    @classmethod
    @property
    def name(cls):
        return cls.__name__
print(type(A.name).__name__)  # → method — а не 'A': цепочка удалена в 3.13

См. также

Открыть в полном глоссарииdocs.python.orgСообщить о неточности