class 个实例的命令历史记录

Command history for class instances

我想创建一个装饰器 class AddToHistory 来在调用某个方法时修改其他 classes 实例的历史条目。 因此,例如,在伪代码中:

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']

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

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

非常感谢!

改用装饰器函数,但如果你真的坚持,你可以把它变成一个装饰器 class(但除非你想要一个参数化的装饰器,否则没有充分的理由在这里使用装饰器 class):

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)