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))
我正在考虑使用元类。。。但对于这么简单的事情来说,这可能太“疯狂”了。我真的不知道类包装器在这里完成了什么。是的,这也是我想到的第一件事。不确定,但可能更容易与装饰?托马斯:肯定不容易。我想不出一种很好地使用装饰器的方法。你完全正确,我指的是具有可变参数数的组合