Python Schoolby trefilov
Шаг 1 из 3+110 XP

@classmethod и @staticmethod

Методы без self или с cls.

@classmethod и @staticmethod

Что это

Обычный метод получает первым аргументом self (объект). Иногда нужен метод, привязанный к классу, а не к экземпляру:

- @classmethod — первым аргументом приходит сам класс (cls). Удобно для альтернативных конструкторов (Date.today()).
- @staticmethod — никаких автоматических аргументов. Просто функция, которую логически удобно держать рядом с классом.

Как это читать

class Date:
    def __init__(self, y, m, d):
        self.y, self.m, self.d = y, m, d
    @classmethod
    def today(cls):
        return cls(2024, 1, 1)   # cls = Date → создаёт Date
    @staticmethod
    def is_leap(y):
        return y % 4 == 0

- Date.today() зовёт today без объекта; cls — это Date.
- Date.is_leap(2024) работает без объекта и без класса в теле — ему ничего не нужно от Date.

Пример

class User:
    def __init__(self, name): self.name = name
    @classmethod
    def guest(cls):
        return cls("guest")
    @staticmethod
    def is_valid(name):
        return bool(name) and name.isalpha()
print(User.guest().name)        # guest
print(User.is_valid("Ann"))     # True

👍 @classmethod — для «именованных» конструкторов: from_json, from_csv, today.
👎 Не злоупотребляй @staticmethod — если функция не использует ни self, ни cls, часто ей вообще не место в классе.