0Pricing
Python Academy · Урок

@classmethod и @staticmethod

Определяйте методы уровня класса и статические методы с подходящими декораторами.

«@classmethod и @staticmethod» — бесплатный урок Python Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Python Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Python Academy содержит 4 уроков всего.

Введение

@classmethod получает класс в качестве первого аргумента. @staticmethod не получает ничего особенного. Оба декоратора определяются в классе.

Экземплярный, классовый и статический методы

Обычные методы получают self. Методы класса получают cls. Статические методы не получают ни того, ни другого. Выбирайте вариант в зависимости от требуемых данных.
class Demo:
    def instance(self): return 'instance'
    @classmethod
    def class_m(cls): return f'class: {cls.__name__}'
    @staticmethod
    def static_m(): return 'static'
d = Demo()
print(d.instance())
print(Demo.class_m())
print(Demo.static_m())

@classmethod как фабрика

Самое распространённое применение — альтернативные конструкторы. Date.from_string('2024-01-15') вместо разбора строки в __init__.
class Date:
    def __init__(self, y,m,d): self.y,self.m,self.d=y,m,d
    @classmethod
    def today(cls):
        from datetime import date
        d = date.today()
        return cls(d.year, d.month, d.day)
    def __repr__(self): return f'{self.y}-{self.m}-{self.d}'
print(Date.today())

@classmethod и наследование

В методе класса cls указывает на фактический подкласс, а не на базовый класс. Благодаря этому фабричные методы корректно работают с подклассами.
class Animal:
    @classmethod
    def create(cls, name):
        return cls(name)
    def __init__(self, name): self.name = name
class Dog(Animal): pass
d = Dog.create('Rex')
print(type(d).__name__, d.name)

@staticmethod для вспомогательных функций

Статические методы — это обычные функции, логически сгруппированные с классом. Они не могут обращаться к данным класса или экземпляра.
class MathHelper:
    @staticmethod
    def clamp(value, lo, hi):
        return max(lo, min(hi, value))
print(MathHelper.clamp(15, 0, 10))
print(MathHelper.clamp(-5, 0, 10))

@staticmethod и функция модуля

Если функции не нужен класс, она может быть функцией уровня модуля. Используйте @staticmethod только тогда, когда функция логически относится к классу.
class Validator:
    @staticmethod
    def is_email(s): return '@' in s and '.' in s
print(Validator.is_email('user@example.com'))
print(Validator.is_email('not-an-email'))

Вызов из экземпляра

Вы можете вызывать @classmethod и @staticmethod у экземпляров, но поведение cls и отсутствие первого аргумента не изменится.
class C:
    @classmethod
    def who(cls): return cls.__name__
    @staticmethod
    def pi(): return 3.14
c = C()
print(c.who())
print(c.pi())

Метод класса для одиночек

Методы класса могут обеспечивать шаблон одиночки, проверяя, существует ли уже экземпляр.
class Singleton:
    _instance = None
    @classmethod
    def get(cls):
        if cls._instance is None:
            cls._instance = cls()
        return cls._instance
a = Singleton.get()
b = Singleton.get()
print(a is b)

Переопределение методов класса

Подкласс может переопределить метод класса. Тогда cls будет указывать на подкласс, сохраняя полиморфизм.
class Base:
    @classmethod
    def info(cls): return f'{cls.__name__} info'
class Child(Base): pass
print(Base.info())
print(Child.info())

Проверка типа с помощью cls

Внутри метода класса cls — это фактический класс. Используйте cls() для создания экземпляров — не указывайте имя класса напрямую.
class Shape:
    @classmethod
    def make(cls):
        return cls()  # NOT Shape()
class Square(Shape): pass
print(type(Square.make()).__name__)

Сочетание с @property

Кэшированное значение уровня класса можно реализовать, сочетая @classmethod и атрибут класса для общего кэширования.
class Config:
    _data = None
    @classmethod
    def load(cls):
        if cls._data is None:
            cls._data = {'debug': True}
        return cls._data
print(Config.load())

Быстрая проверка

Что представляет собой cls в @classmethod?

Итоги

@classmethod получает cls: используйте его для фабрик, альтернативных конструкторов и одиночек. @staticmethod ничего не получает: используйте его для вспомогательных функций. cls — это фактический класс или подкласс.

Продолжайте

Отличный прогресс! Продолжайте, чтобы освоить следующую концепцию.

Часто задаваемые вопросы

Урок «@classmethod и @staticmethod» бесплатный?

Да — полный текст урока «@classmethod и @staticmethod» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Python Academy, подпишись на CoddyKit PRO. Курс Python Academy содержит 4 уроков всего.

Чему я научусь в уроке «@classmethod и @staticmethod»?

Определяйте методы уровня класса и статические методы с подходящими декораторами. Ты практикуешь Python Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Python Academy?

Предыдущий опыт не требуется. Python Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «@classmethod и @staticmethod»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Python Academy?

Да. Каждый урок Python Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Функции как объекты первого класса
  2. Написание пользовательских декораторов
  3. Декоратор @property
  4. @classmethod и @staticmethod
← Назад к Python Academy