【发布时间】:2022-01-19 11:50:19
【问题描述】:
我正在处理一个包含数十个“业务逻辑”方法和一些辅助方法的大型 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 中实现这一点?
【问题讨论】:
-
这对我来说看起来不错,除了我们无法从您可能想要执行的代码中看到的其他内容。您可以添加错误捕获或额外变量以使“calc_metric”部分灵活。
-
公平地说,代码有效。
-
但是,如果您认为所有这些方法都不是真正必要的,并且您想消除其中的一些,我看不出它们各自的不同之处以及它们是否有一些共同的东西可以删除其中的一些。
-
不,它们每个都编码独特的业务逻辑,但非常相关。我找到了一种在每个方法定义周围使用装饰器将它们“添加”到寄存器和/或向方法对象添加属性以使其更明确哪些方法是帮助器以及应该由
run_all()运行的方法方法。