问题描述
我需要创建一个算法,该算法作为在运行时选择的一系列功能执行,有点像策略模式。我想避免创建许多单一方法类(超过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]
我有几个问题:
- 如何修改修饰器函数
act
以将列表actions
作为参数,以便将修饰的函数添加到列表中? - 如何使用另一个文件中定义的
specific_fnX
?目前,我只是将文件导入调用函数中-但这似乎很奇怪。还有其他选择吗?
还有其他有关实现此模式的想法吗?
解决方法
This是有关使用装饰器(带参数和不带参数)的很好的教程。其他人可能认识其他人。
诀窍是要记住装饰器是一个函数调用,但是当将其应用于函数定义时,它神奇地将函数替换为返回的结果。如果您希望@my_decorator(my_list)
成为装饰器,则my_decorator(my_list)
必须使用__call__
方法返回一个函数或一个对象,然后在specific_fn1
上调用该函数。
是的,您需要一个返回一个函数的函数,该函数返回一个函数。查看教程中的一些示例将使这一点更加清楚。
关于第二个问题,您可以不使用装饰器直接调用my_decorator(my_list)(specific_fn1)
,然后点火结果。