Как использовать декораторы классов в Python?

Ответ

Декоратор класса в Python — это функция, которая принимает класс, изменяет его и возвращает изменённую версию. Это мощный инструмент для модификации поведения класса, добавления функциональности, регистрации классов или применения проверок во время его определения.

Пример:

def add_method(cls):
    # Декоратор добавляет новый метод 'hello' к классу
    def hello(self):
        return f"Hello from {self.__class__.__name__}! I'm a new method!"
    cls.hello = hello
    return cls

@add_method
class MyClass:
    pass

obj = MyClass()
print(obj.hello())  # Выведет: Hello from MyClass! I'm a new method!

Применение и особенности:

  • Декоратор выполняется один раз, при определении класса, до создания его экземпляров.
  • Он может добавлять, удалять или изменять методы и атрибуты класса.
  • Часто используется для реализации паттернов (например, Singleton), для автоматической регистрации классов в реестре или для добавления метаданных.
  • Декоратор должен вернуть класс (исходный, модифицированный или новый), который заменит исходный в точке определения.

Ответ 18+ 🔞

Да ты посмотри, что эти питонячие мудрецы выдумали! Декоратор класса — это ж как будто ты принёс свой старенький «Запорожец» в тюнинг-ателье, а тебе его там так обвесили, прошили и прикрутили, что он теперь «Ламборджини», блядь. По сути, это функция, которая хватает твой класс, как кот сука собака, насилует его по-тихому, что-то туда добавит, что-то уберёт, и подсовывает тебе обратно уже изменённую версию. И ты потом такой: «О, а откуда у меня тут эта новая фича?»

Вот смотри, пример, чтобы совсем пиздец понятно стало:

def add_method(cls):
    # Декоратор добавляет новый метод 'hello' к классу
    def hello(self):
        return f"Hello from {self.__class__.__name__}! I'm a new method!"
    cls.hello = hello
    return cls

@add_method
class MyClass:
    pass

obj = MyClass()
print(obj.hello())  # Выведет: Hello from MyClass! I'm a new method!

Видал? Класс MyClass был пустым, как мои карманы после зарплаты. Но декоратор add_method подсунул ему метод hello прямо в процессе создания. Красота, да? Чистая магия, только без кролика и цилиндра.

Где это применяется и на что смотреть:

  • Весь этот цирк происходит ровно один раз, когда интерпретатор видит определение класса. То есть до того, как ты создашь хоть один объект. Это как прошивку в телефон заливают — один раз и навсегда.
  • Декоратор может делать с классом что угодно: новые методы прилепить, старые оторвать, атрибуты поменять. Полный карт-бланш, ёпта.
  • Часто эту штуку используют для разных умных паттернов. Например, чтобы сделать класс синглтоном (чтоб он был один, как солнце в небе, блядь). Или чтобы классы автоматом регистрировались в каком-нибудь списке. Удобно, не надо руками каждый раз писать.
  • Главное правило — декоратор обязан вернуть класс. Неважно, тот же самый, но потрёпанный жизнью, или вообще новый, с нуля собранный. Но вернуть он должен именно класс, иначе пиши пропало — получишь ошибку, которая заставит тебя ебать свои старые костыли от недоумения.

Вот и весь сказ. Инструмент мощный, как удар кувалдой, но и пользоваться им надо с умом, а то так накосячишь, что потом полгода будешь разгребать.