【问题标题】:Python: Strategy pattern with decoratorsPython:带有装饰器的策略模式
【发布时间】:2020-10-14 21:55:28
【问题描述】:

我需要创建一个算法,它作为在运行时选择的一系列函数执行,有点像策略模式。我想避免创建许多单一方法类(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?目前,我只是在调用函数中导入文件——但这似乎很奇怪。还有其他选择吗?

另外,关于实现这个模式还有其他想法吗?

【问题讨论】:

    标签: python python-3.x python-decorators strategy-pattern


    【解决方案1】:

    This 是一个很好的关于使用装饰器的教程,包括带参数和不带参数。其他人可能知道其他人。

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

    所以是的,你需要一个返回函数的函数。查看教程中的一些示例会更清楚。

    关于你的第二个问题,你可以直接调用my_decorator(my_list)(specific_fn1)而不使用装饰器,然后忽略结果。

    【讨论】:

      猜你喜欢
      • 2014-12-12
      • 2011-08-19
      • 2015-06-02
      • 2012-01-09
      • 2012-01-28
      • 1970-01-01
      • 2010-10-07
      • 1970-01-01
      • 2011-05-20
      相关资源
      最近更新 更多