每次用函数参数和值执行类中的函数时,更新列表

2024-06-17 10:45:48 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

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)

例如:

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__一起使用,但没有得到很好的结果。你知道吗

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

谢谢


Tags: 方法函数用户self顺序过程defprocess
1条回答
网友
1楼 · 发布于 2024-06-17 10:45:48

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

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

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

调用以下命令:

p = process()

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

如果印刷精美,将产生以下结果:

[{'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

相关问题 更多 >