类实例的命令历史记录

时间:2018-10-25 14:42:36

标签: python class methods decorator history

我想创建一个装饰器类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']

修饰器应自动使用修饰方法的名称。

我已经搜索并尝试了一段时间,但找不到实现此目的的好方法。 您身边有什么提示吗?

非常感谢!

1 个答案:

答案 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)