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