Я работаю с довольно большой базой кода ООП, и я хотел бы добавить некоторые трассировки/протоколирования. Самый простой способ сделать это - представить декоратор вокруг определенных методов на некоторых базовых классах, но, к сожалению, декораторы не наследуются.Python: Наследование наложения декоратора?
я попробовать что-то вроде следующего:
def trace(fn):
def wrapper(instance, *args, **kwargs):
result = fn(instance, *args, **kwargs)
# trace logic...
return result
return wrapper
class BaseClass(object):
def __init__(self, ...):
...
self.__call__ = trace(self.__call__) # line added to end of method
... и в то время как метод __call__
является завернутые (который я могу видеть из печати информации экземпляра на консоль) в wrapper
функции ISN» t выполняется, как ожидалось.
Я также кратко рассмотрел использование метакласса на основе this answer, но он мгновенно разбивает другие части системы, которые используют интроспекцию, поэтому я думаю, что это не-go.
Есть ли какой-либо другой способ я могу заставить приложение этих декораторов использовать метод классов __call__
, наследующий от BaseClass
?
Итак, вы говорите, что хотите обернуть '__call__' в' BaseClass' и все его дочерние элементы? – freakish
@ freakish: да, вроде. '__call__' в' BaseClass' перезаписывается всеми дочерними элементами (и их много), поэтому применение декоратора вокруг '__call__' на уровне' BaseClass' является самым простым способом последовательно добавлять трассировку в одном месте. –
Это то же самое, что вы пытаетесь решить, декоратор на базовом классе наследует подкласс. http://stackoverflow.com/questions/3782040/python-decorators-that-are-part-of-a-base-class-cannot-be-used-to-decorate-membe –