我想创建一个装饰器类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']
修饰器应自动使用修饰方法的名称。
我已经搜索并尝试了一段时间,但找不到实现此目的的好方法。 您身边有什么提示吗?
非常感谢!
答案 0 :(得分:1)
使用装饰器函数代替,但是如果您确实坚持的话,可以将其转换为装饰器类(但是除非您想要参数化装饰器,否则这里没有很好的理由来装饰器类):
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)