Шаг 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, часто ей вообще не место в классе.