如何在Python类中运行一组类似的方法?

3

我正在处理一个包含数十个"业务逻辑"方法和少量辅助方法的大型Python类。在结尾处有一些有趣的代码,用于运行所有的 "calc_metric_*" 方法。

大致上像这样:

class CalculateMetrics:
    ...

    def calc_metric_x1(self):
        ...

    def calc_metric_x2(self):
        ...

    def calc_metric_x3(self):
        ...

    def calc_metric_x4(self):
        ...
    
    ...

    def calc_metric_x50(self):
        ...

    def run_all(self):
       method_list = [m for m in dir(self) 
                      if callable(getattr(self, m)) 
                      and m.startswith('calc_metric_')]

       for m in method_list:
           # Call each method
           getattr(self, m)()

我觉得使用getattr和引用方法名称的方式似乎不太理想。在Python中有更好的实现方法吗?


1
公平地说,这段代码是有效的。 - MYK
不,它们各自编码独特的业务逻辑,但是它们之间有很大的关联。我找到了一种方法,可以在每个方法定义周围使用装饰器来将它们“添加”到一个注册表中和/或向方法对象添加属性,以使哪些方法是辅助方法,哪些应该由run_all()方法运行更加明确。 - MYK
1个回答

0
你可以使用一个装饰器函数来收集它们,像这样:
def calc_metric(func):
    if func not in calc_metric.calc_metric_funcs:
        calc_metric.calc_metric_funcs.append(func)
    return func


calc_metric.calc_metric_funcs = []

然后您需要使用@calc_metric修饰所有所需的函数:

    @calc_metric
    def calc_metric_x1(self):
        
        ...

    @calc_metric
    def calc_metric_x2(self):
        ...

    ...

    @calc_metric
    def calc_metric_x50(self):
        ...

而你的run_all()函数将会是这样:

    def run_all(self):
        for f in calc_metric.calc_metric_funcs:
            f(self)


请注意,calc_metric函数必须在CalculateMetrics类之外声明。

是的,完美。这似乎是最好的方式。 - MYK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接