Ответ
Параметр cls в методе класса (декорированном @classmethod) представляет собой сам класс, а не его экземпляр (который передается как self в обычных методах).
Это позволяет методу работать с атрибутами класса или создавать экземпляры класса, не имея доступа к конкретному объекту. Основное применение — фабричные методы, которые предоставляют альтернативные способы создания объектов.
Пример: Фабричный метод
Предположим, мы хотим создавать объект User из строки с датой рождения в формате YYYY-MM-DD.
from datetime import date
class User:
def __init__(self, name: str, age: int):
self.name = name
self.age = age
@classmethod
def from_birth_year(cls, name: str, birth_year: int):
"""Альтернативный конструктор для создания пользователя по году рождения."""
current_year = date.today().year
age = current_year - birth_year
# cls() вызывает конструктор __init__ класса User
return cls(name, age)
# Основной способ создания
user1 = User("Alice", 30)
# Использование фабричного метода @classmethod
user2 = User.from_birth_year("Bob", 1995)
print(f"{user2.name} is {user2.age} years old.")
# Вывод: Bob is 29 years old. (для 2024 года)
Ключевые отличия от self:
cls: Ссылается на класс (User). Используется в@classmethod.self: Ссылается на конкретный экземпляр класса (user1,user2). Используется в обычных методах экземпляра.