Я хочу создать класс декоратора AddToHistory
для изменения записей истории экземпляров других классов при вызове определенного метода.
Так, например, в псевдокоде:
class AddToHistory(object):
...
def __call__(self, ...):
instance.history.append(fun_name)
class MyClass(object):
def __init__(self):
self.history = []
@AddToHistory
def methodA():
...
@AddToHistory
def methodB(input):
...
def methodC():
...
inst = MyClass()
print(inst.history)
>>> []
inst.methodA()
print(inst.history)
>>> ['methodA']
inst.methodB(myinput)
print(inst.history)
>>> ['methodA', 'methodB']
inst.methodC()
print(inst.history)
>>> ['methodA', 'methodB']
Декоратор должен автоматически использовать имя декорированного метода.
Я уже довольно долго искал и пытался, но не смог найти хороший способ реализовать это. Есть намеки с вашей стороны?
Заранее большое спасибо!
Вместо этого используйте функцию декоратора, но вы можете превратить ее в класс декоратора, если действительно настаиваете (но если вам не нужен параметризованный декоратор, здесь нет веских причин для класса декоратора):
from functools import wraps
def add_to_history(func):
@wraps(func)
def wrapper(self, *args, **kw):
self.history.append(func.__name__)
return func(self, *args, **kw)
return wrapper
class MyClass(object):
def __init__(self):
self.history = []
@add_to_history
def methodA(self):
return "method A"
@add_to_history
def methodB(self, input):
return "method B %s" % input
def methodC(self):
return "methodC"
inst = MyClass()
print(inst.history)
inst.methodA()
print(inst.history)
inst.methodB("myinput")
print(inst.history)
inst.methodC()
print(inst.history)
Приятно, вот и все :-) Спасибо!