Какие декораторы вы использовали в своей практике?
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