все 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Сообщить о неточности