关于python:每次使用函数参数和值执行函数时,更新列表

Update a list every time a function within a class is executexecuted with the function arguments and values

在过去的6个月中,我为不同的计算创建了许多类和函数。现在我想把它们加入到一个类中,这样其他用户就可以使用它了。像许多方法一样,可以按顺序执行,并且可能需要对不同的数据集多次运行序列。我想在主类中创建一个函数,它保存了用户使用的过程,这样用户就可以再次运行它,而不必再次执行整个过程。

重要提示:我不想更改已经实现的类,但是如果这是唯一的方法,没有问题。

这个想法或多或少类似于下面的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class process(object):
    def __init__(self):
        self.procedure = []

    def MethodA(valueA):
        pass

    def MethodB(valueB):
        pass

    def UpdateProcedure(self, method, arguments, values):
        # Execute this every time that MethodA or MethodB is executed.
        new = {'Method':method, 'Arguments':arguments, 'Values':values}
        self.procedure.append(new)

例如:

1
2
3
4
5
a = process.MethodA(2)
b = process.MethodB(3)

print(process.procedure)
>>> [{'Method':'MethodA', 'Arguments':['valueA'], 'Values':[2]}, {'Method':'MethodB', 'Arguments':['valueB'], 'Values':[3]}]

我试过同时使用inspect.currentframe__getattribute__两个函数,但没有取得好的效果。

有什么办法帮我解决这个问题吗?

谢谢


以下是根据Moinuddin Quadri的建议,如何使用装饰器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def remember(func):
    def inner(*args, **kwargs):
        args[0].procedure.append({'method': func,
                                  'args': args,
                                  'kwargs': kwargs})
        return func(*args, **kwargs)
    return inner

class process(object):
    def __init__(self):
        self.procedure = []

    @remember
    def MethodA(self, valueA):
        pass

    @remember
    def MethodB(self, valueB):
        pass

这使得每次调用这些修饰方法时,都将把它们的参数附加到该对象的过程数组中。此修饰符将在非类方法上失败。

调用这些命令:

1
2
3
4
5
6
7
p = process()

p.MethodA(1)
p.MethodB(2)
p.MethodA(3)
p.MethodB(4)
print p.procedure

如果打印精美,将导致以下结果:

1
2
3
4
5
6
7
8
9
10
11
12
[{'args': (<__main__.process object at 0x7f25803d28d0>, 1),
  'kwargs': {},
  'method': <function MethodA at 0x7f25803d4758>},
 {'args': (<__main__.process object at 0x7f25803d28d0>, 2),
  'kwargs': {},
  'method': <function MethodB at 0x7f25803d4848>},
 {'args': (<__main__.process object at 0x7f25803d28d0>, 3),
  'kwargs': {},
  'method': <function MethodA at 0x7f25803d4758>},
 {'args': (<__main__.process object at 0x7f25803d28d0>, 4),
  'kwargs': {},
  'method': <function MethodB at 0x7f25803d4848>}]

其中<__main__.process object at 0x7f25803d28d0>为过程对象(self)

在这里阅读更多关于装饰的信息:https://en.wikipedia.org/wiki/python_syntax_and_semantics_decorators