История команд для экземпляров классов - PullRequest
0 голосов
/ 25 октября 2018

Я хочу создать класс декоратора 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 голосов
/ 25 октября 2018

Вместо этого можно использовать функцию декоратора, но вы можете превратить ее в класс декоратора, если вы действительно настаиваете (но если вам не нужен параметризованный декоратор, здесь нет веской причины для класса декоратора):

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)
...