Что представляет собой параметр `cls` в методе, декорированном `@classmethod` в Python

Ответ

Параметр 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). Используется в обычных методах экземпляра.