我正在尝试从 OOP 过渡到函数式编程。我遇到以下情况:(变量没有意义 - 它们只是示例)。
Funcs = namedtuple('Funcs', ('func1', 'func2'))
def thing_1(alpha, beta):
gamma = alpha+beta
def func_1(x):
return x+gamma
def func_2(x):
return x*gamma
return Funcs(func_1, func_2)
def thing_2(alpha, beta):
gamma = alpha+beta
delta = alpha*beta
def func_1(x):
return x+gamma
def func_2(x):
return x*gamma+delta
return Funcs(func_1, func_2)
现在,我们有一些代码重复:func_1
在这两个方面是相同的。这两件事也以相同的方式初始化 gamma。
如果我使用 OOP,很明显该做什么 - 制作一个 BaseThing
,制作 func_2
抽象,并让 Thing1 覆盖方法 func_2
,和 Thing2
覆盖 func_2
方法和 __init__
(它将调用 BaseThing.__init__
然后初始化 delta)。
使用闭包,这对我来说并不明显 - 做同样事情的最佳方法是什么?
最佳答案
你的具体例子我没看懂,但是更抽象的说,OOP和FP的区别可以概括如下:
- 面向对象
- 对象是一个单位
- 通过虚方法实现参数化
- 特化是通过继承实现的
换句话说,对象的行为取决于(或“参数化”)它调用的虚拟方法。要修复(或“专门化”)一组特定的“参数”(=方法),您可以扩展该对象。
- 在计划生育中
- 功能是一个单元
- 通过函数参数实现参数化
- 通过部分应用实现特化
要参数化一个函数,您需要将其他函数传递给它。要修复一组参数,您可以创建一个新函数,该函数是具有部分应用参数的基本函数。
插图:
# OOP style
class Animal:
def voice(self):
pass
def greet(self, person):
return '%s, %s!' % (self.voice(), person)
class Dog(Animal):
def voice(self):
return 'woof'
class Cat(Animal):
def voice(self):
return 'meow'
print Dog().greet('master')
print Cat().greet('master')
# FP style
def greet(voice, person):
return '%s, %s!' % (voice(), person)
from functools import partial
dogGreet = partial(greet, lambda: 'woof')
catGreet = partial(greet, lambda: 'meow')
print dogGreet('master')
print catGreet('master')
关于Python:等价于闭包继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28431201/