Python:带有装饰器的策略模式

问题描述

我需要创建一个算法,该算法作为在运行时选择的一系列功能执行,有点像策略模式。我想避免创建许多单一方法类(超过100个),而是使用简单的函数,并使用装饰器将其组装。

actions = []

def act(specific_fn):
    actions.append(specific_fn)
    return specific_fn


@act
def specific_fn1():
    print("specific_fn1")

@act
def specific_fn2():
    print("specific_fn2")

def execute_strategy():
    [f() for f in actions]

我有几个问题:

  1. 如何修改修饰器函数act以将列表actions作为参数,以便将修饰的函数添加到列表中?
  2. 如何使用另一个文件中定义的specific_fnX?目前,我只是将文件导入调用函数中-但这似乎很奇怪。还有其他选择吗?

还有其他有关实现此模式的想法吗?

解决方法

This是有关使用装饰器(带参数和不带参数)的很好的教程。其他人可能认识其他人。

诀窍是要记住装饰器是一个函数调用,但是当将其应用于函数定义时,它神奇地将函数替换为返回的结果。如果您希望@my_decorator(my_list)成为装饰器,则my_decorator(my_list)必须使用__call__方法返回一个函数或一个对象,然后在specific_fn1上调用该函数。

是的,您需要一个返回一个函数的函数,该函数返回一个函数。查看教程中的一些示例将使这一点更加清楚。

关于第二个问题,您可以不使用装饰器直接调用my_decorator(my_list)(specific_fn1),然后点火结果。