Назад к вопросам
Middle
67
questionbank

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

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

@property - для создания управляемых атрибутов, где получение, установка или удаление значения можно перехватывать и изменять поведение. @staticmethod - для методов класса, которым не нужен доступ ни к экземпляру, ни к классу. @classmethod - для методов класса, которые получают ссылку на сам класс в качестве первого аргумента (обычно cls). @lru_cache из модуля functools - для кеширования результатов вызова функций на основе их аргументов. Пользовательские декораторы - для логирования, авторизации, измерения времени выполнения.

Пример использования @property:

class MyClass:
    def __init__(self, x):
        self._x = x

    @property
    def x(self):
        # getter
        return self._x

    @x.setter
    def x(self, value):
        # setter
        if value < 0:
            raise ValueError("Значение должно быть положительным")
        self._x = value

Пример использования @staticmethod:

class MyClass:
    @staticmethod
    def greet(name):
        # Не зависит от экземпляра или класса
        print(f"Привет, {name}")

Пример использования @classmethod:

class MyClass:
    _instances = 0

    def __init__(self):
        MyClass._instances += 1

    @classmethod
    def get_instance_count(cls):
        # Получает доступ к атрибутам класса
        return cls._instances

Пример использования @lru_cache:

from functools import lru_cache

@lru_cache(maxsize=128)
def fibonacci(n):
    # Кеширует результаты вызова
    if n < 2:
        return n
    return fibonacci(n - 1) + fibonacci(n - 2)

Пример пользовательского декоратора для логирования:

import logging

def log_func_call(func):
    def wrapper(*args, **kwargs):
        logging.info(f"Вызов функции {func.__name__} с аргументами: {args}, {kwargs}")
        result = func(*args, **kwargs)
        logging.info(f"Функция {func.__name__} завершена, результат: {result}")
        return result
    return wrapper

@log_func_call
def my_function(a, b):
    return a + b