Python 调用多个函数并返回集合结果

Python 调用多个函数并返回集合结果,python,design-patterns,Python,Design Patterns,我想对单个值调用一些函数并返回集合结果 class Foo: def __init__(self, i): self.i = i def get(self): return self.fn1(self.fn2(self.i)) #200 def fn1(self, i): return i + i #10+10 = 20 def fn2(self, i): return i * i #20*20

我想对单个值调用一些函数并返回集合结果

class Foo:
    def __init__(self, i):
        self.i = i

    def get(self):
        return self.fn1(self.fn2(self.i)) #200

    def fn1(self, i):
        return i + i #10+10 = 20

    def fn2(self, i):
        return i * i #20*20 = 200

    #...

foo = Foo(10)
print(foo.get())

有没有更优雅的方式或模式?

下面是我尝试改进的地方

def fn1(i):
    return i + i #10+10 = 20

def fn2(i):
    return i * i #20*20 = 200

def get(i):
    funcs = [fn2, fn1]
    for f in funcs:
        i = f(i)
    return i

print(get(10))

您可以使用装饰风格的解决方案:

class Base()

    def __init__(self, decorated):
       self.decorates = decorated

    def foo(self, arg):
        if self.decorates:
            arg = self.decorates.foo( arg )

        return self._do_foo( arg )

    def _do_foo(self, arg):
       return arg
您的实现将从Base继承并实现_do_foo()。 您可以这样设置它:

a = Subclass(None)
b = AnotherSublcass( a )
c = YetAnotherSubclass( b )

所有子容器都从基继承。调用c.foo(arg)时,结果将通过所有三个_do_foo()方法传递。

就我个人而言,我最喜欢的两个python函数是map和reduce

def get(i):
    return reduce(lambda acc, f: f(acc), [i,fn2,fn1] )

def fn1(i):
    return i + i #10+10 = 20

def fn2(i):
    return i * i #20*20 = 200

print( get(10) ) # 200

一般来说,上面所做的嵌套函数是用Python编写函数的最直接和可读的方法

如果您正在编写许多函数,那么编写一个
compose
函数可能是值得的

def compose(*funcs):
    if len(funcs) == 1:
        return funcs[0]
    else:
        def composition(*args, **kwargs):
            return funcs[0](compose(*funcs[1:])(*args, **kwargs))
        return composition
或者,如果您更喜欢迭代而不是递归解决方案:

def compose_pair(f1, f2):
    def composition(*args, **kwargs):
        return f1(f2(*args, **kwargs))
    return composition

def compose_iterative(*funcs):
    iterfuncs = iter(funcs)
    comp = next(iterfuncs)
    for f in iterfuncs:
        comp = compose_pair(comp, f)
    return comp

不是真的。这有什么不对?@s.Lott,只是不太好,特别是如果您添加了一些方法,比如:
self.fn1(self.fn2(self.fn3(self.i))
我正在考虑使用元类。。。但对于这么简单的事情来说,这可能太“疯狂”了。我真的不知道类包装器在这里完成了什么。是的,这也是我想到的第一件事。不确定,但可能更容易与装饰?托马斯:肯定不容易。我想不出一种很好地使用装饰器的方法。你完全正确,我指的是具有可变参数数的组合