Предположим, я определил:
def to_class(cls):
""" returns a decorator
aimed to force the result to be of class cls. """
def decorating_func(func):
def wrapper(*args, **kwargs):
return cls(func(*args, **kwargs))
return wrapper
return decorator(decorating_func)
Я хочу использовать его для создания декораторов, которые превращают результаты функций в объекты данного класса. Однако это не сработает:
class TestClass(object):
def __init__(self, value):
self._value = (value, value)
def __str__(self):
return str(self._value)
@staticmethod
@to_test_class
def test_func(value):
return value
to_test_class = to_class(TestClass)
поскольку test_func будет искать to_test_class и не найдет его. С другой стороны, размещение присваивания to_test_class перед определением класса также не удастся, так как TestClass еще не будет определен.
Попытка поместить @to_class(TestClass) выше определения test_func также не удастся, поскольку метод создается до класса (если я не ошибаюсь).
Единственный обходной путь, который я нашел, - это определить to_test_class вручную как декоратор, а не как возвращаемый из общего определения "to_class".
Возможно, важно упомянуть, что это только базовый пример, но я хочу использовать to_class для многих приложений, таких как изменение возвращаемого значения перед «подключением» его в конструктор класса; и я хочу использовать его как декоратор для методов других классов.
Я уверен, что некоторые считают декоратор to_class бессмысленным; Вместо этого манипуляции могут быть выполнены внутри декорированного метода. Тем не менее, я нахожу это удобным, и это помогает мне с читабельностью.
Наконец, я хочу добавить, что это интересует меня на 20% из практических соображений и на 80% из соображений изучения, так как я не совсем понимаю декораторы в Python в целом.