我正在使用一個包含數十個“業務邏輯”方法和一些輔助方法的大型 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 中實作這一點?
uj5u.com熱心網友回復:
您可以使用裝飾器函式來收集它們,如下所示:
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類之外宣告。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/385764.html
上一篇:模板函式忽略繼承類的成員
